2

GUIDとして注文番号を発行する会社のデータベースを継承しました。注文番号を見積もりたい場合は、必ずしもユーザーフレンドリーではありません。したがって、私がやりたいのは、新しいint列を追加し、既存の各注文(日時順に並べられている)に一意の順次注文番号を追加することです。

それは素晴らしいアイデアですが、私は実際に更新クエリとしてそれを行う方法に固執しています!どんな助けでも大歓迎です。

4

3 に答える 3

5

テーブルにID列を追加すると、番号付けが自動的に行われます。

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

一方通行。

alter table t add order_id int identity

これにより、自動インクリメントのintID列が追加されます。IDが既存の行に割り当てられる順序についての保証はありませんが、一意のIDが既存の各行に割り当てられます。この変更後に挿入された新しい行ごとに、新しい一意のIDが取得されます。

これを実際のアプリケーションに適用する前に、既存のコードがID列で機能するかどうかを検討してください。多くの場合、このアプローチは本当に無害なアップグレードです。setidentity_insertを使用しない限り、ID列を挿入しようとするコードは失敗します。列を削除せずにIDプロパティを削除することはできません。

これを締めくくるには、取得速度と、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 に答える