2015-07-20 92 views
1

我有一个表model与主键aliasSQL Server将主键更改为不同的[新]列并更新外键引用

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

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

问题是如何做到这一点凌乱的业务干净,并在正确的顺序。我可以修改我们用来从头开始创建数据库的脚本,没有任何问题,但是混乱的部分是如何更新现有的数据库。

我对这样的复杂行为的知识有限,而不是继续花费第二天或第二天的时间来研究如何以正确的方式做到这一点,并且可能使我的db数据库数次,我宁愿做正确的第一次。

回答

0
  1. 将标识列添加到模型。
  2. 将新的FK列添加到设备和错误。
  3. 更新设备和错误,将新的FK列设置为Model的新PK的值,其中旧的FK =旧的PK(别名)。
  4. 下降,由设备和错误的老FK列
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) 

我认为这是可能的查询系统表收获你的约束标识并将上述代码重写为存储过程,以便您只需调用SPU即可更新依赖/客户端表数据并构建约束。让我知道你是否想要更多的例子。