SQL Server添加主键

时间:2010-05-25 00:07:36

标签: sql-server-2005 primary-key

我有一个表需要被赋予一个新的主键,因为我的前任使用varchar(8)行作为主键,现在我们遇到了问题。我知道如何添加主键,但不确定将此新主键添加到具有外键的其他表的正确方法。这就是我所拥有的:

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_fk还是users.new_user_id=orders.new_user_fk,我都需要获得相同的结果。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

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

我建议您将新列添加到所有表中,然后更新值以使它们匹配....运行几个查询以确保一切正常。删除PK和FK约束并使用新列添加新的PK和FK约束

当然我会备份所有这些表以防万一

select * into backup_ orders from orders

通过这种方式,您可以始终拥有该数据,以防需要回滚

答案 1 :(得分:1)

将varchar替换为int,不要在同一个表中保留重复项。

写一些类似我最近使用的代码的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