SQL: 是否可以同时插入两个 tables,自动生成的 id 从第一个 table 输出到第二个
SQL: Is it possible to insert into two tables at the same time with autogenerated id output from first table into second
我的数据库包含两个 tables FileStore 和 FileRepository。
FileStore table 包含 3 列 ID(自动生成的唯一标识符)、文件名和描述
-> Initial state with demo 数据
FileRepository table 包含 3 列 Id(自动生成的唯一标识符)、Name 和 FileId(这是指 FileStore table 中的 Id 列)-> Initial state with demo data
我得到一组 FileStore ID 作为搜索条件。同样,我需要首先在 FileStore table 中为满足的每个条件创建一个重复行。我还需要根据 FileId 列上的相同数据为第二个 table FileRepository 创建重复行。在这里,但我需要使用 FileStore 操作自动生成的 Id 列更新新创建行的 FileId 列。
如果我需要复制文件文件 1(ID 为 b3304dc4-4f2e-46d4-8f64-a597edb02e96)和文件 2(ID 为 [=],请参阅附件图片43=]7cb40baf-1ecf-4e5f-92ff-57029a20e623) 这就是 tables 在操作后应该有数据的方式
复制后的 FileStore db 应该有这样的数据:
复制后的 FileRepository db 应该有这样的数据:
哪种方法最好?是否可以通过没有任何循环的查询来实现?
对于第一个 table 我可以这样插入并获取插入的 ID:
INSERT INTO FileStore(FileName,Description)
OUTPUT INSERTED.Id as InsertedIds
SELECT
FileName, Description
from FileStore
where Id IN ('b3304dc4-4f2e-46d4-8f64-a597edb02e96','7cb40baf-1ecf-4e5f-92ff-57029a20e623')
但不确定更新 FileRepository table 的查询,该查询将 InsertedIds 作为输入
INSERT INTO FileRepository(Name,FileId)
SELECT
Name, {{How do I use InsertedDetails here?}}
from FileRepository
where FileId IN ('b3304dc4-4f2e-46d4-8f64-a597edb02e96','7cb40baf-1ecf-4e5f-92ff-57029a20e623')
PS: 这只是我为这个问题创建的参考table。如果我需要说得更清楚,请告诉我
- 首先,插入你parenttable的数据。
然后
INSERT INTO FileRepository (`id`, `Name`,`FileId`)
VALUES('id_or_auto_generated','name value', SELECT SCOPE_IDENTITY())
SELECT SCOPE_IDENTITY();将 return 最近 auto-generated SQL 服务器数据库连接的 ID。
对于其他数据库:Follow this post
正如我提到的,您需要使用 OUTPUT
子句。这是伪SQL,在缺少可消耗的样本数据和预期结果的情况下。您需要适当 remove/change 大括号 ({}
) 中的部分:
DECLARE @Output table (ID uniqueindentifier,
{Other Columns});
INSERT INTO FileStore(FileName,Description)
OUTPUT INSERTED.Id, {Other Columns}
INTO @Output
SELECT FileName,
Description
from FileStore
where Id IN ('b3304dc4-4f2e-46d4-8f64-a597edb02e96','7cb40baf-1ecf-4e5f-92ff-57029a20e623');
INSERT INTO FileRepository(Name,FileId)
SELECT FR.Name,
O.ID
from FileRepository FR
{CROSS} JOIN @Output O {ON Some Condition}
where FileId IN ('b3304dc4-4f2e-46d4-8f64-a597edb02e96','7cb40baf-1ecf-4e5f-92ff-57029a20e623')
我的数据库包含两个 tables FileStore 和 FileRepository。
FileStore table 包含 3 列 ID(自动生成的唯一标识符)、文件名和描述 -> Initial state with demo 数据
FileRepository table 包含 3 列 Id(自动生成的唯一标识符)、Name 和 FileId(这是指 FileStore table 中的 Id 列)-> Initial state with demo data
我得到一组 FileStore ID 作为搜索条件。同样,我需要首先在 FileStore table 中为满足的每个条件创建一个重复行。我还需要根据 FileId 列上的相同数据为第二个 table FileRepository 创建重复行。在这里,但我需要使用 FileStore 操作自动生成的 Id 列更新新创建行的 FileId 列。
如果我需要复制文件文件 1(ID 为 b3304dc4-4f2e-46d4-8f64-a597edb02e96)和文件 2(ID 为 [=],请参阅附件图片43=]7cb40baf-1ecf-4e5f-92ff-57029a20e623) 这就是 tables 在操作后应该有数据的方式
复制后的 FileStore db 应该有这样的数据:
复制后的 FileRepository db 应该有这样的数据:
哪种方法最好?是否可以通过没有任何循环的查询来实现?
对于第一个 table 我可以这样插入并获取插入的 ID:
INSERT INTO FileStore(FileName,Description)
OUTPUT INSERTED.Id as InsertedIds
SELECT
FileName, Description
from FileStore
where Id IN ('b3304dc4-4f2e-46d4-8f64-a597edb02e96','7cb40baf-1ecf-4e5f-92ff-57029a20e623')
但不确定更新 FileRepository table 的查询,该查询将 InsertedIds 作为输入
INSERT INTO FileRepository(Name,FileId)
SELECT
Name, {{How do I use InsertedDetails here?}}
from FileRepository
where FileId IN ('b3304dc4-4f2e-46d4-8f64-a597edb02e96','7cb40baf-1ecf-4e5f-92ff-57029a20e623')
PS: 这只是我为这个问题创建的参考table。如果我需要说得更清楚,请告诉我
- 首先,插入你parenttable的数据。
然后
INSERT INTO FileRepository (`id`, `Name`,`FileId`) VALUES('id_or_auto_generated','name value', SELECT SCOPE_IDENTITY())
SELECT SCOPE_IDENTITY();将 return 最近 auto-generated SQL 服务器数据库连接的 ID。
对于其他数据库:Follow this post
正如我提到的,您需要使用 OUTPUT
子句。这是伪SQL,在缺少可消耗的样本数据和预期结果的情况下。您需要适当 remove/change 大括号 ({}
) 中的部分:
DECLARE @Output table (ID uniqueindentifier,
{Other Columns});
INSERT INTO FileStore(FileName,Description)
OUTPUT INSERTED.Id, {Other Columns}
INTO @Output
SELECT FileName,
Description
from FileStore
where Id IN ('b3304dc4-4f2e-46d4-8f64-a597edb02e96','7cb40baf-1ecf-4e5f-92ff-57029a20e623');
INSERT INTO FileRepository(Name,FileId)
SELECT FR.Name,
O.ID
from FileRepository FR
{CROSS} JOIN @Output O {ON Some Condition}
where FileId IN ('b3304dc4-4f2e-46d4-8f64-a597edb02e96','7cb40baf-1ecf-4e5f-92ff-57029a20e623')