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将自动使用新插入的值作为当前标识值。”