2010-05-25 113 views
1

我有一個表需要給予一個新的主鍵,因爲我的predeces使用varchar(8)行作爲主鍵,現在我們遇到了問題。我知道如何添加主鍵,但我不確定將這個新主鍵添加到具有外鍵的其他表的正確方式。以下是我有:SQL Server添加主鍵

users table: 
    old_user_id varchar(8) 
    ... 
    ... 
    new_user_id int 

orders table: 
    order_id  int 
    ... 
    ... 
    old_user_fk  varchar(8) 
    new_user_fk  int(11) 

我需要我是否連接表上users.old_user_id=orders.old_user_fkusers.new_user_id=orders.new_user_fk得到相同的結果。任何幫助表示讚賞。

回答

1

什麼是int(11)? SQL Server只有tinyint,smallint,int和bigint

我建議你向所有表中添加新的列,然後更新這些值以使它們匹配....運行幾個查詢以確保它們都可以工作。下降的PK和FK約束和使用新列

我當然會備份所有這些表以防萬一

select * into backup_ orders from orders 

這樣,你總是有增加新的PK和FK約束的情況下,數據你需要回滾

+0

對不起,只是最近不得不切換回從MySQL SQL Server的笑 – 2010-05-25 00:17:55

1

用int替換你的varchar,不要在同一個表中保留重複項。

寫一些類似TSQL這段代碼我最近使用:

BEGIN TRANSACTION 

-- temp tables to hold data 
DECLARE @HeaderTemp table 
     (vid varchar(8), 
     [Name] varchar (50)) 

DECLARE @SecondaryTemp table 
    (vid_fk varchar(8), 
    [Value] varchar (50)) 

-- store table data   
INSERT INTO @HeaderTemp 
    SELECT * FROM [Header] 

INSERT INTO @SecondaryTemp 
    SELECT * FROM [Secondary] 

-- empty data from tables 
DELETE FROM [Secondary] 
DELETE FROM [Header] 

-- drop constraints 
ALTER TABLE [SECONDARY] DROP CONSTRAINT [FK_SECONDARY_HEADER] 
ALTER TABLE [dbo].[HEADER] DROP CONSTRAINT [PK_HEADER] 

-- convert varchar to int 
ALTER TABLE [SECONDARY] ALTER COLUMN VID_FK INT NOT NULL 
ALTER TABLE [HEADER] ALTER COLUMN VID INT NOT NULL 

-- re-create constraints 
ALTER TABLE [dbo].[HEADER] ADD CONSTRAINT [PK_HEADER] PRIMARY KEY CLUSTERED 
(
[vid] ASC 
)  
ALTER TABLE [dbo].[SECONDARY] WITH CHECK ADD CONSTRAINT [FK_SECONDARY_HEADER] 
    FOREIGN KEY([vid_fk]) REFERENCES [dbo].[HEADER] ([vid]) 

-- put data back 
INSERT INTO [Header] 
    SELECT * FROM @HeaderTemp 

INSERT INTO [Secondary] 
    SELECT * FROM @SecondaryTemp 

COMMIT TRANSACTION