【问题标题】:TSQL Copy Dilemma with Uniqueidentifier带有唯一标识符的 TSQL 复制困境
【发布时间】:2015-10-19 15:13:43
【问题描述】:

我正在尝试为具有唯一标识符的表以及具有引用该唯一标识符的外键的子表创建测试数据。

我将如何复制每个表中的每一行,同时在每个引用表之间保持相同的关系。我无法弄清楚如何使用外键从子表中引用新创建的唯一标识符。

谢谢!

MAIN_TABLE

MAIN_ID
1234
5678

SUB_TABLE

SUB_ID    MAIN_ID
abcd      1234
efgh      5678

现在复制 MAIN_TABLE 的每个条目中的数据

MAIN_TABLE

MAIN_ID
1234
5678
9123
4567

SUB_TABLE

SUB_ID    MAIN_ID
abcd      1234
efgh      5678
ijkl      9123
mnop      4567

我怎么知道如何引用新创建的唯一标识符以在子表中用作外键。

【问题讨论】:

  • 发布您的表结构。我无法想象您的要求有什么困难。
  • @TabAlleman 更新了问题。

标签: sql tsql copy uniqueidentifier


【解决方案1】:

使用辅助变量插入新值以保存生成的NEWID

CREATE TABLE #main(main_id UNIQUEIDENTIFIER PRIMARY KEY);

CREATE TABLE #sub(sub_id VARCHAR(100) PRIMARY KEY,
                  main_id UNIQUEIDENTIFIER FOREIGN KEY REFERENCES #main(main_id)
                  );

DECLARE @new_guid UNIQUEIDENTIFIER = NEWID();

INSERT INTO #main(main_id)
VALUES (@new_guid);

INSERT INTO #sub(sub_id, main_id)
VALUES ('abc', @new_guid);


SELECT *
FROM #main

SELECT *
FROM #sub;

将数据从一个表复制到另一个表:

INSERT INTO #main_new(main_id);
SELECT main_id
FROM #main;

INSERT INTO #sub_new(sub_id, main_id)
SELECT sub_id, main_id
FROM #sub;

编辑:

使用连接和临时表重新插入数据然后将特定列插入表的示例。

SELECT NEWID() as guid, sub_id, [rn] = ROW_NUMBER() OVER(ORDER BY m.main_id)
INTO #temporary
FROM #main m
JOIN #sub s
  ON m.main_id = s.main_id


INSERT INTO #main
SELECT guid
FROM #temporary;

INSERT INTO #sub
SELECT CONCAT(sub_id, rn), guid
FROM #temporary;

SELECT *
FROM #main;

SELECT *
FROM #sub;

【讨论】:

  • 我理解使用辅助变量,但我如何在包含 10 或 100 个条目的整个表中使用相同的想法?一旦制作了第一个副本,它将尝试插入 store uniqueidentifier @new_guid 并失败,因为它不是唯一的。感谢您的帮助!
  • @wellmannered INSERT INTO main VALUES ('guid_1'), ('guid_2'), (guid_3)INSERT INTO sub VALUES ('abc', 'guid_1'), ('efg', 'guid_2'), ('hij', 'guid_3');
  • 所以这种方法无法自动执行此操作,我正在使用的表有 100 个条目?
  • @wellmannered 我已经在我的回答中发布了这个场景。先用INSERT INTO ... SELECT ...做主表,再用子表
  • 我也确实看到了,但我需要将这些条目复制到我从中复制它们的同一个表中。对困惑感到抱歉。本质上,我需要将所有数据从 MAIN 和 SUB 复制到 MAIN 和 SUB,与新值的唯一区别是它们新创建的唯一标识符。根据我的理解,使用您的方法,我必须为每个条目手动输入一个新的 guid。
猜你喜欢
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 2018-03-01
  • 2013-05-07
  • 2013-04-13
  • 1970-01-01
相关资源
最近更新 更多