Ode*_*ded 3 foreign-key sql-server migration ddl
我正在精简一直使用char
/varchar
字段的数据库,其中binary
/varbinary
将是更好的选择(假设表示的数据是字节数组)。
我正在更改的字段之一用于许多其他表的外键约束。
我不能删除当前的 FK 约束,将列迁移到它的新类型,然后简单地重新创建 FK 约束,因为数据类型不匹配。
我应该采取什么方法来迁移它?你会怎么做?
给出下一个例子:
CREATE TABLE A
(
[ID] VARCHAR(10) NOT NULL,
CONSTRAINT [PK_A] PRIMARY KEY ([ID])
);
CREATE TABLE B
(
[ID] INT PRIMARY KEY,
[A_ID] VARCHAR(10) NOT NULL,
CONSTRAINT [FK_B] FOREIGN KEY ([A_ID]) REFERENCES A([ID])
);
CREATE TABLE C
(
[ID] INT PRIMARY KEY,
[A_ID] VARCHAR(10) NOT NULL,
CONSTRAINT [FK_C] FOREIGN KEY ([A_ID]) REFERENCES A([ID])
);
INSERT INTO A VALUES ('001'), ('010'), ('100');
INSERT INTO B VALUES (1, '001'), (2, '001'), (3, '010');
INSERT INTO C VALUES (4, '010'), (5, '100'), (6, '100');
Run Code Online (Sandbox Code Playgroud)
0- 备份、备份和备份您的数据库。
1- 由于您试图将 varchar 转换为 varbinary 并且没有显式转换,您应该向表中添加新列。注意:您不能使其成为 non nullables。
ALTER TABLE A ADD [ID_VB] VARBINARY(10);
ALTER TABLE B ADD [A_ID_VB] VARBINARY(10);
ALTER TABLE C ADD [A_ID_VB] VARBINARY(10);
Run Code Online (Sandbox Code Playgroud)
2- 将当前值复制到新列:
BEGIN TRANSACTION
UPDATE A SET [ID_VB] = CAST([ID] AS VARBINARY(10));
UPDATE B SET [A_ID_VB] = CAST([A_ID] AS VARBINARY(10));
UPDATE C SET [A_ID_VB] = CAST([A_ID] AS VARBINARY(10));
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)
3- 下降电流限制:
ALTER TABLE B DROP CONSTRAINT [FK_B];
ALTER TABLE C DROP CONSTRAINT [FK_C];
ALTER TABLE A DROP CONSTRAINT [PK_A];
Run Code Online (Sandbox Code Playgroud)
4- 检查新值是否正确后,删除实际列:
ALTER TABLE A DROP COLUMN [ID];
ALTER TABLE B DROP COLUMN [A_ID];
ALTER TABLE C DROP COLUMN [A_ID];
Run Code Online (Sandbox Code Playgroud)
5- 用旧名称重命名新列:
EXEC sp_rename 'A.ID_VB', 'ID', 'COLUMN';
EXEC sp_rename 'B.A_ID_VB', 'A_ID', 'COLUMN';
EXEC sp_rename 'C.A_ID_VB', 'A_ID', 'COLUMN';
Run Code Online (Sandbox Code Playgroud)
6- 使新列不可为空:
ALTER TABLE A ALTER COLUMN [ID] VARBINARY(10) NOT NULL;
ALTER TABLE B ALTER COLUMN [A_ID] VARBINARY(10) NOT NULL;
ALTER TABLE C ALTER COLUMN [A_ID] VARBINARY(10) NOT NULL;
Run Code Online (Sandbox Code Playgroud)
7-再次添加约束:
ALTER TABLE A ADD CONSTRAINT [PK_A] PRIMARY KEY ([ID]);
ALTER TABLE B ADD CONSTRAINT [FK_B] FOREIGN KEY ([A_ID]) REFERENCES A([ID]);
ALTER TABLE C ADD CONSTRAINT [FK_C] FOREIGN KEY ([A_ID]) REFERENCES A([ID]);
Run Code Online (Sandbox Code Playgroud)
8- 检查最终结果:
SELECT * FROM A;
SELECT * FROM B;
SELECT * FROM C;
Run Code Online (Sandbox Code Playgroud)
| 身份证 | | :------- | | 0x303031 | | 0x303130 | | 0x313030 | 身份证 | 援助 -: | :------- 1 | 0x303031 2 | 0x303031 3 | 0x303130 身份证 | 援助 -: | :------- 4 | 0x303130 5 | 0x313030 6 | 0x313030
db<>在这里摆弄