2010-05-25 85 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