0

私は次の2つのテーブルとデータを持っています:-

CREATE TABLE customers
    ([id] int, [name] varchar(10), [sex] varchar(1))
;

INSERT INTO customers
    ([id], [name], [sex])
VALUES
    (1050, 'John Doe', 'M'),
    (1060, 'Jane Doe', 'F'),
    (1031, 'Joe Bloggs', 'M')
;

CREATE TABLE orders
    ([id] int, [fk] int, [product] varchar(13))
;

INSERT INTO orders
    ([id], [fk], [product])
VALUES
    (51, 1050, 'Blue car'),
    (57, 1050, 'Yellow car'),
    (43, 1060, 'Pink bus'),
    (32, 1031, 'Black pen'),
    (87, 1031, 'Orange jacket')
;

私がやりたいのは、両方のテーブルのid列に1から順番に番号を付け直すことです。

注文テーブルのリンクされた行にも番号を付け直す必要があり、このテーブルの外部キーは、customersテーブルの新しい番号と一致する必要があります。

したがって、データは次のようになる必要があります。-

ID      NAME        SEX
0001    John Doe    M
0002    Jane Doe    F
0003    Joe Bloggs  M

ID    FK    PRODUCT
0001  0001  Blue car
0002  0001  Yellow car
0003  0002  Pink bus
0004  0003  Black pen
0005  0003  Orange jacket

SQL Serverでこれを行うにはどうすればよいですか?

4

3 に答える 3

6

ここでカーソルに頼る必要はまったくありません(そうです!)....次のようなものが必要です:

-- Table "Customers" - rename column "id" to "old_id"
EXEC sp_rename 'dbo.Customers.id', 'old_id'

-- add new "id" column
ALTER TABLE Customers ADD id INT 

-- fill new "id" column with sequential values, ordered by the "old_id" value
;WITH CTE AS
(
    SELECT old_id, new_id = ROW_NUMBER() OVER (ORDER BY old_id) 
    FROM Customers
)
UPDATE dbo.Customers
SET id = CTE.new_id
FROM CTE
WHERE CTE.old_id = dbo.Customers.old_id

-- Table "Orders" - rename column "id" to "old_id"
EXEC sp_rename 'dbo.orders.id', 'old_id'

-- add new "id" column
ALTER TABLE Orders ADD id INT 

-- update the FK references to the new "id" values in table "dbo.Customers"
UPDATE dbo.Orders 
SET fk = c.id
FROM dbo.Customers c
WHERE dbo.ORders.fk = c.old_id

-- fill new "id" column with sequential values, ordered by the "old_id" value
;WITH CTE AS
(
    SELECT old_id, new_id = ROW_NUMBER() OVER (ORDER BY old_id) 
    FROM dbo.Orders
)
UPDATE dbo.Orders
SET id = CTE.new_id
FROM CTE
WHERE CTE.old_id = dbo.Orders.old_id

-- drop the old, no longer required columns "old_id" from both tables
ALTER TABLE dbo.Customers DROP COLUMN old_id
ALTER TABLE dbo.Orders DROP COLUMN old_id

これらの2つのテーブルのいずれかを参照している他のFK関係がない場合は、これで機能します。その場合、このアップグレードスクリプトを開始する前に、これらのFK関係を無効にするか削除する必要がある場合があります。

于 2012-12-04T14:41:48.077 に答える
2

これがあなたがしたい1回限りのメンテナンスタイプの修正である場合、私はこれを次のように行います:

  1. すべてのフォアギンキーを無効にする
  2. oldid顧客テーブルに列を追加します
  3. 現在のIDフィールドをフィールドに入力しoldidます
  4. すべての顧客IDを新しいIDに置き換えます
  5. oldid顧客テーブルのフィールドの結合/更新を使用して、現在更新されているIDで注文テーブルを更新します
  6. oldid列をドロップします
  7. 外国のキー制約を追加し直します。

出来上がり

于 2012-12-04T14:33:06.143 に答える
0
  1. 外部キーを削除します。
  2. IDENTITYとして追加の列と列をcustomers2持つテーブルを作成します。OldIdId
  3. からのすべての行を挿入しますcutomerscustomers2にマッピングcustomers.Idしてcustomers2.OldId
  4. orders.fk設定時に更新するorders.fk=customers2.id
  5. ポイント2と3で行ったのと同じordersことをテーブルで行います。customers
  6. ドロップcustomers、ドロップorders、名前変更customers2、名前変更orders2
  7. 外部キーを再作成します。
于 2012-12-04T14:46:04.343 に答える