使用不同类型的主键传输数据

时间:2015-10-30 19:27:59

标签: sql-server

我正在重新设计非常旧的数据库,其中新表格具有PK类型UNIQUEIDENTIFIER而旧表格具有INT。表之间也存在许多关系。任何人都可以帮助在传输数据时如何不丢失任何关系并更改PK类型? 旧表:项目(PK - itemID(int),FK - Vendor_Id(int)和Manufacture_Id(int)制造商ID不是设置为FK,但它应该在新表中。

1 个答案:

答案 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;

完成。