假设我的表结构看起来像这样:
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]
?这是否可能?