我正在重新设计非常旧的数据库,其中新表格具有PK类型UNIQUEIDENTIFIER
而旧表格具有INT
。表之间也存在许多关系。任何人都可以帮助在传输数据时如何不丢失任何关系并更改PK类型?
旧表:项目(PK - itemID(int),FK - Vendor_Id(int)和Manufacture_Id(int)制造商ID不是设置为FK,但它应该在新表中。
答案 0 :(得分:0)
假设您有一个空的School和Student表,其中UNIQUEIDENTIFIER
类型的主键名为id。
让我们说学生和学校之间的关系是多对一的,通过school_id外键。
旧表称为oldSchool和oldStudent,并且具有int
类型的id列。 oldStudent
还有一个名为school_id的外键。
采取的步骤:
使用名为old_id的int
类型的额外列扩展外键引用的所有新表。在示例表中,School将获得这个额外的列:
ALTER TABLE School ADD old_id int;
所有外键列都应该得到一个类型为int
的sybling列,名为old_original_name。在我们的例子中
学生应该获得额外的old_school_id专栏
暂时禁用外键约束:
SET foreign_key_checks = 0;
或者,如果失败,请删除所有外键,以便稍后重新创建它们,例如:
ALTER TABLE Student DROP FOREIGN KEY fk_school_id;
还可以使这些外键列可以为空:
ALTER TABLE Student MODIFY school_id int NULL;
将旧表中的记录插入新表中,确保其值为 主键和外键存储在目标的相应old_xxxxxx列中。 在示例中,它看起来像这样:
INSERT INTO School (old_id, name, address)
SELECT id, name, address
FROM oldSchool;
INSERT INTO Student (name, class, old_school_id)
SELECT name, class, school_id
FROM oldStudent;
通过old_xxxx外键值查找新id,更新null的外键列。在我们的例子中:
UPDATE Student
SET school_id = (
SELECT id
FROM School
WHERE old_id = Student.old_id);
现在再次使这些外键列不可为空:
ALTER TABLE Student MODIFY school_id int NOT NULL;
再次启用外键约束。
SET foreign_key_checks = 1;
或者如果您必须删除它们,请重新创建它们,例如:
ALTER TABLE Student
ADD CONSTRAINT fk_school_id
FOREIGN KEY (school_id)
REFERENCES School(id);
(可选)从所有表中删除所有old_xxxxx列。在示例中:
ALTER TABLE Student DROP COLUMN old_school_id;
ALTER TABLE School DROP COLUMN old_id;
可选择删除所有旧表。在示例中:
DROP TABLE oldStudent;
DROP TABLE oldSchool;
完成。