【发布时间】:2015-07-12 06:34:34
【问题描述】:
假设我们有一个像这样的自引用表
CREATE TABLE Month
(
Id int IDENTITY(1,1) PRIMARY KEY,
Title char(128)
)
CREATE TABLE Entity
(
Id int IDENTITY(1,1) PRIMARY KEY,
MonthId int FOREIGN KEY REFERENCES Month(Id),
Name char(128),
ParentId int FOREIGN KEY REFERENCES Entity(Id),
)
我想将某个 MonthId 的所有行复制到另一个 MonthId。重复的 parentId 也应该更新,实体和他们的父母应该在同一个月。
例如假设我们有
Id MonthId Name ParentId
------------------------------------
1 1 name1 null
2 1 name11 1
3 1 name3 null
4 1 name31 3
5 1 name311 4
将monthId=1 行复制到monthId=2 后,结果应如下所示:
Id MonthId Name ParentId
------------------------------------
1 1 name1 null
2 1 name11 1
3 1 name3 null
4 1 name31 3
5 1 name311 4
newId1 2 name1 null
newId2 2 name11 newId1
newId3 2 name3 null
newId4 2 name31 newId3
newId5 2 name311 newId4
newId 是 DBMS 生成的值。
注意:我使用 Sql-Server 2012 作为 DBMS。
【问题讨论】:
-
旁注:请不要在您的
name列中使用char(128)!这将使 all 您的姓名长度为 128 个字符 - 较短的姓名用空格填充到定义的长度!这太糟糕了,浪费空间 - 使用varchar(128)代替它只使用所需的空间 -
这只是一个例子,我在实际应用中使用 nvarchar(128),因为我需要 Unicode 字符。
-
我能想到一种有点麻烦的方法,用旧的 id 和旧的父 id 将记录插入到临时表中,然后用正确的值将它们插入到主表中,但我敢肯定它可以以更直接的方式完成,所以我不会将其作为答案发布。
-
A.你确定你的表定义是合法的(特别是
Month(Id))?如果是这样,您是否只关心ParentId列? -
@Amit,我更正了架构定义。主要部分是parentId。
标签: sql sql-server sql-server-2012 hierarchical-data self-reference