SQL Server将主键更改为不同的[new]列并更新外键引用

时间:2015-07-20 19:52:06

标签: sql-server

我的表model的主键varcharalias

我有另一个表device和一个表error,每个表都有一个引用model alias主键的外键。

我需要做的是向model添加一个新列,该列将用作新的主键(int indentity(1,1)),因此alias只是一个普通的旧列。这意味着我还需要正确更新deviceerror中的外键引用,以反映model中的新主键列。

问题是如何干净利落地以正确的顺序完成这项混乱的业务。我可以修改我们用来从头创建db的脚本没有问题,但是杂乱的部分是如何更新现有数据库。

我对这样复杂的行为知之甚少,而不是继续花费第二天或第二天来确定如何以正确的方式做到这一点,并且可能将我的数据库塞进几次,我宁愿做正确的事情。时间。

2 个答案:

答案 0 :(得分:0)

  1. 将标识列添加到模型。
  2. 将新的FK列添加到设备和错误。
  3. 更新设备和错误,将新的FK列设置为Model的新PK值,其中旧FK =旧PK(别名)。
  4. 从设备和错误中删除旧的FK列

答案 1 :(得分:0)

听起来你需要执行几个步骤:

-- Assuming you have PK and FK names:
CREATE TABLE #one ( alias VARCHAR(10) NOT NULL, meta VARCHAR(MAX) )
CREATE TABLE #device ( alias VARCHAR(10) NOT NULL, device_info VARCHAR(MAX) )

ALTER TABLE #one ADD CONSTRAINT pk_one PRIMARY KEY ( alias )
ALTER TABLE #device ADD CONSTRAINT fk_device_one FOREIGN KEY ( alias ) REFERENCES #one( alias )

-- Data setup:
INSERT INTO #one ( alias, meta ) VALUES ( 'one', '' )
INSERT INTO #one ( alias, meta ) VALUES ( 'two', '' )
INSERT INTO #one ( alias, meta ) VALUES ( 'three', '' )
INSERT INTO #one ( alias, meta ) VALUES ( 'four', '' )

INSERT INTO #device ( alias, device_info ) VALUES ( 'one', '' )
INSERT INTO #device ( alias, device_info ) VALUES ( 'two', '' )
INSERT INTO #device ( alias, device_info ) VALUES ( 'three', '' )
INSERT INTO #device ( alias, device_info ) VALUES ( 'four', '' )

-- STEP 1: Add new fields
ALTER TABLE #one ADD one_id INT IDENTITY(1,1)
ALTER TABLE #device ADD one_id INT

-- STEP 2: Update dependent table data
UPDATE #device SET #device.one_id = #one.one_id FROM #device, #one WHERE #device.alias = #one.alias

-- STEP 3: Update Constraints on primary table
ALTER TABLE #one DROP CONSTRAINT pk_one
ALTER TABLE #one ADD CONSTRAINT pk_one PRIMARY KEY ( one_id )

-- STEP 4: Update FK Constraints
ALTER TABLE #device DROP CONSTRAINT fk_device_one
ALTER TABLE #device ADD CONSTRAINT fk_device_one FOREIGN KEY ( one_id ) REFERENCES #one( one_id )

我认为可以查询系统表以获取约束ID并将上述代码重写为存储过程,这样您只需要调用SPU来更新依赖/客户端表数据并构建约束。如果你想要更多的例子,请告诉我。