我有一个表需要被赋予一个新的主键,因为我的前任使用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
,我都需要获得相同的结果。任何帮助表示赞赏。
答案 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