我的表model
的主键varchar
为alias
。
我有另一个表device
和一个表error
,每个表都有一个引用model
alias
主键的外键。
我需要做的是向model
添加一个新列,该列将用作新的主键(int indentity(1,1)
),因此alias
只是一个普通的旧列。这意味着我还需要正确更新device
和error
中的外键引用,以反映model
中的新主键列。
问题是如何干净利落地以正确的顺序完成这项混乱的业务。我可以修改我们用来从头创建db的脚本没有问题,但是杂乱的部分是如何更新现有数据库。
我对这样复杂的行为知之甚少,而不是继续花费第二天或第二天来确定如何以正确的方式做到这一点,并且可能将我的数据库塞进几次,我宁愿做正确的事情。时间。
答案 0 :(得分:0)
答案 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来更新依赖/客户端表数据并构建约束。如果你想要更多的例子,请告诉我。