Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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 是否可以在不使用临时列的情况下将parentID作为移动操作的一部分进行更新?_Sql_Sql Server - Fatal编程技术网

Sql 是否可以在不使用临时列的情况下将parentID作为移动操作的一部分进行更新?

Sql 是否可以在不使用临时列的情况下将parentID作为移动操作的一部分进行更新?,sql,sql-server,Sql,Sql Server,我遇到的问题是,我有一个旧数据库,其中通常有许多具有内部父/子关系的表。这些表正在迁移到较新的数据结构,但我们希望保留旧的关系。今天,我的做法如下: Old table is tbl_contract. PK: contract_pk, FK: contract_parent_id, contract_name New table is contract. PK: ID, FK contract_parent_id, name ALTER TABLE contract ADD contract

我遇到的问题是,我有一个旧数据库,其中通常有许多具有内部父/子关系的表。这些表正在迁移到较新的数据结构,但我们希望保留旧的关系。今天,我的做法如下:

Old table is tbl_contract. PK: contract_pk, FK: contract_parent_id, contract_name
New table is contract. PK: ID, FK contract_parent_id, name

ALTER TABLE contract ADD contract_pk INT NULL
INSERT INTO contract ( [name], contract_pk )
    SELECT contract_name, contract_pk FROM dbo.tbl_contract
UPDATE contract SET contract_parent_id = 
    (SELECT c.id FROM contract as c WHERE c.contract_pk = 
         (SELECT contract_parent FROM tbl_contract 
          WHERE contract_pk = contract.contract_pk)
     )
ALTER TABLE contract DROP COLUMN contract_pk

有更简单的方法吗?

假设ID是一个标识列,并且与contract\u pk的类型相同,您可以在上使用
SET identity\u INSERT以允许您使用旧值覆盖自动生成的标识列:

SET IDENTITY_INSERT contract ON

INSERT INTO contract ( ID, contract_parent_id, [name] )
SELECT contract_pk, contract_parent_id, contract_name FROM dbo.tbl_contract

SET IDENTITY_INSERT contract OFF

假设您在contract\u parent\u id上有一个FK约束,那么您可能也需要先禁用该约束,然后在执行插入后重新启用它。

这会起作用,不过如果说我有pk的1,2,3,8,9,我有点怀疑它是如何起作用的。那么SQL server下次将插入什么ID?4或10?@devzero-根据文档,它看起来应该是10:“如果插入的值大于表的当前标识值,SQL Server将自动使用新插入的值作为当前标识值。”