2

我继承了一个公司数据库,该数据库将订单号作为 GUID。当您想引用您的订单号时,不完全是用户友好的!所以我想要做的是添加一个新的 int 列,并为每个现有订单(已按日期时间排序)添加一个唯一的顺序订单号。

这是一个好主意,但我一直坚持如何将其作为更新查询来执行!任何帮助将不胜感激。

4

3 回答 3

5

在您的表中添加一个标识列,编号将为您处理。

alter table YourTable add YourTableID int identity
于 2012-04-28T17:24:12.250 回答
3

单程。

alter table t add order_id int identity

这将添加一个自动递增的 int 标识列。无法保证将 id 分配给现有行的顺序,但将为每个现有行分配一个唯一的 id。在此更改之后插入的每个新行都将获得一个新的唯一 ID。

在将其应用于实际应用程序之前,请考虑现有代码是否可以与标识列一起使用。通常这种方法是一种真正无害的升级。尝试插入标识列的代码会失败,除非它使用 set identity_insert。如果不删除列,则无法删除标识属性。

为了解决这个问题,可能需要对新 id 进行唯一约束,以提高检索速度和在 id 列被更新时强制唯一性。

于 2012-04-28T17:26:53.673 回答
2

不幸的是,如果您只是在表中添加一个 IDENTITY 列,现有订单不一定会获得按 OrderDate 顺序分配的 IDENTITY 值,因此如果您想根据订单日期分配订单 ID 值,它们将“乱序” (这似乎合乎逻辑)。快速示例:

CREATE TABLE dbo.Orders
(
    OrderGUID UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY,
    OrderDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);

INSERT dbo.Orders(OrderDate) VALUES
('20120101'), ('20120102'), ('20120103');
GO

ALTER TABLE dbo.Orders ADD OrderID INT IDENTITY(1,1);
GO
SELECT OrderID, OrderGUID, OrderDate = CONVERT(DATE, OrderDate) 
FROM dbo.Orders 
ORDER BY OrderDate;

结果(显然你的会有所不同):

OrderID OrderGUID                            OrderDate
------- ------------------------------------ ----------
2       C5CE909E-0469-45AE-A828-647C7F54AA14 2012-01-01
1       70D8EEB1-FDA8-4E56-874F-771999C6DB84 2012-01-02
3       8E7B42C3-6C4D-4860-8A82-AFADDBA96A4A 2012-01-03

如果这是不可接受的,您可能应该创建一个新表并将所有旧订单插入其中(此时您也可以删除 GUID 列,正如我在评论中提到的那样)。

CREATE TABLE dbo.OrdersCopy
(
  OrderID INT IDENTITY(1,1) PRIMARY KEY,
  ... other columns ...
);

INSERT dbo.OrdersCopy (OrderDate, ... other columns ...)
SELECT OrderDate, ... other columns ...
FROM dbo.Orders 
ORDER BY OrderDate
OPTION (MAXDOP 1); -- single-threaded is important!

EXEC sp_rename 'dbo.Orders', 'OrdersOld', 'OBJECT';
EXEC sp_rename 'dbo.OrdersCopy', 'Orders', 'OBJECT';

(如果您想在清理其他表时暂时保留旧的 GUID 以供参考,那可能没问题,但您不应该再让它自动填充,并且您应该计划删除它,因为它很宽且冗余。 )

于 2012-04-28T17:45:50.133 回答