Sql server 使用不同类型的主键传输数据
我正在重新设计非常旧的数据库,其中新表有PK typeSql server 使用不同类型的主键传输数据,sql-server,Sql Server,我正在重新设计非常旧的数据库,其中新表有PK typeUNIQUEIDENTIFIER,旧表有INT。表之间也有许多关系。在传输数据时,有人能帮助您避免失去任何关系和更改PK类型吗? 旧表:Item(PK-itemID(int)、FK-Vendor_Id(int)和Manufacture_Id(int)Manufacture Id未设置为FK,但应位于新表中。假设您有空的School和Student表,其中包含名为Id的UNIQUEIDENTIFIER键入的主键。 假设学生和学校之间的关系是多对
UNIQUEIDENTIFIER
,旧表有INT
。表之间也有许多关系。在传输数据时,有人能帮助您避免失去任何关系和更改PK类型吗?
旧表:Item(PK-itemID(int)、FK-Vendor_Id(int)和Manufacture_Id(int)Manufacture Id未设置为FK,但应位于新表中。假设您有空的School和Student表,其中包含名为Id的UNIQUEIDENTIFIER键入的主键。 假设学生和学校之间的关系是多对一的,通过学校id外键。 旧表称为oldSchool和oldStudent,其id列的类型为
int
.oldStudent
还有一个名为school_id的外键
采取的步骤:
使用类型为int
的名为old_id的额外列扩展外键引用的所有新表。在示例表中,School将获得此额外列:
ALTER TABLE School ADD old_id int;
所有外键列都应该得到类型为int
的sybling列,称为old_original_name
学生应额外获得一个旧的学校id栏
暂时禁用外键约束:
SET foreign_key_checks = 0;
或者,如果失败,请删除所有外键,以便稍后重新创建它们,例如:
ALTER TABLE Student DROP FOREIGN KEY fk_school_id;
UPDATE Student
SET school_id = (
SELECT id
FROM School
WHERE old_id = Student.old_id);
ALTER TABLE Student
ADD CONSTRAINT fk_school_id
FOREIGN KEY (school_id)
REFERENCES School(id);
还要使这些外键列为空:
ALTER TABLE Student MODIFY school_id int NULL;
将旧表中的记录插入新表,确保
主键和外键存储在目标对应的old_uxxxxxx列中。
在本例中,它将如下所示:
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;
通过旧的_xxxx外键值查找新id,更新空外键列。在我们的示例中:
ALTER TABLE Student DROP FOREIGN KEY fk_school_id;
UPDATE Student
SET school_id = (
SELECT id
FROM School
WHERE old_id = Student.old_id);
ALTER TABLE Student
ADD CONSTRAINT fk_school_id
FOREIGN KEY (school_id)
REFERENCES School(id);
现在,使这些外键列不再为空:
ALTER TABLE Student MODIFY school_id int NOT NULL;
再次启用外键约束
SET foreign_key_checks = 1;
或者,如果必须删除它们,请重新创建它们,例如:
ALTER TABLE Student DROP FOREIGN KEY fk_school_id;
UPDATE Student
SET school_id = (
SELECT id
FROM School
WHERE old_id = Student.old_id);
ALTER TABLE Student
ADD CONSTRAINT fk_school_id
FOREIGN KEY (school_id)
REFERENCES School(id);
(可选)从所有表中删除所有旧的_xxxxx列。在示例中:
ALTER TABLE Student DROP COLUMN old_school_id;
ALTER TABLE School DROP COLUMN old_id;
DROP TABLE oldStudent;
DROP TABLE oldSchool;
可以选择删除所有旧表。在示例中:
ALTER TABLE Student DROP COLUMN old_school_id;
ALTER TABLE School DROP COLUMN old_id;
DROP TABLE oldStudent;
DROP TABLE oldSchool;
完成。请更具体一些。如果您可以发布一些数据。这是一个过于宽泛的问题,但您可能希望创建一个临时映射表,其中包含用于转换的新旧主键。我在回答中添加了删除外键约束并使相应字段为空的步骤,然后进一步我很惊讶禁用外键并没有起作用——这肯定是MySQL语法。您已经用
MySQL
标记了您的问题,所以我假设这就是您正在处理的问题。