Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用不同类型的主键传输数据_Sql Server - Fatal编程技术网

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

Sql 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键入的主键。 假设学生和学校之间的关系是多对

我正在重新设计非常旧的数据库,其中新表有PK type
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
标记了您的问题,所以我假设这就是您正在处理的问题。