【发布时间】:2010-09-14 20:34:06
【问题描述】:
假设我的表结构如下所示:
CREATE TABLE [dbo].[table1] (
[id] [int] IDENTITY(1,1) NOT NULL,
[data] [varchar](255) NOT NULL,
CONSTRAINT [PK_table1] PRIMARY KEY CLUSTERED ([id] ASC)
)
CREATE TABLE [dbo].[table2] (
[id] [int] IDENTITY(1,1) NOT NULL,
[table1_id] [int] NOT NULL,
[data] [varchar](255) NOT NULL,
CONSTRAINT [PK_table2] PRIMARY KEY CLUSTERED ([id] ASC)
)
第一个表的[id] 字段对应于第二个表的[table1_id] 字段。我想做的是在单个事务中将数据插入两个表中。现在我已经知道如何通过执行 INSERT-SELECT-INSERT 来做到这一点,如下所示:
BEGIN TRANSACTION;
DECLARE @id [int];
INSERT INTO [table1] ([data]) VALUES ('row 1');
SELECT @id = SCOPE_IDENTITY();
INSERT INTO [table2] ([table1_id], [data]) VALUES (@id, 'more of row 1');
COMMIT TRANSACTION;
对于像只插入少量行这样的小情况来说,这一切都很好。但是我需要做的是一次插入几十万行,甚至可能是一百万行。数据来自另一个表,所以如果我只是将它插入到一个表中,那很容易,我只需要这样做:
INSERT INTO [table] ([data])
SELECT [data] FROM [external_table];
但是我将如何做到这一点并将数据拆分为[table1] 和[table2],并且仍然使用适当的[table1_id] 更新[table2]?这可能吗?
【问题讨论】:
-
很多SQL初学者经常问的好问题。
标签: sql sql-server tsql insert foreign-keys