首页 > 解决方案 > 使用 JDBC 插入包含外键的行,该外键是 Microsoft SQL 中自动递增的字段

问题描述

我有两个表 foo 和 bar,foo 有一个自动递增的字段 colA。我需要在 foo 中插入一条记录并获取自动递增的值,然后插入 bar(外键)。使用 postgresql,这是一个简单的单个查询,但是在 SQL 服务器中我无法找到正确的查询。

PostgreSQL

With row as (insert into foo(colB) values('x') RETURNING colA ) insert into bar(colA) select colA from row

有没有什么方法可以在 MsSql 中使用单个查询来实现?

服务器版本详情

DBMS: Microsoft SQL Server (ver. 13.00.5882)
Driver: Microsoft JDBC Driver 8.2 for SQL Server (ver. 8.2.2.0, JDBC4.2)

标签: sql-serverjdbcsql-server-2012

解决方案


由于 SQL Server 的限制,您需要使用两个插入语句来执行此操作。例如以下代码:

create table dbo.foo (
  colA int not null identity,
  colB varchar(10),
  constraint PK_foo primary key (colA)
);

create table dbo.bar(
  colC int not null,
  constraint FK_bar_colC_foo_colA foreign key (colC) references dbo.foo (colA)
);

insert dbo.foo (colB)
  output inserted.colA into dbo.bar (colC)
  values ('x');

生成错误消息:

Msg 332 Level 16 State 1 Line 12
The target table 'dbo.bar' of the OUTPUT INTO clause cannot be on either side
of a (primary key, foreign key) relationship.
Found reference constraint 'FK_bar_colC_foo_colA'.

但是,如果您注释掉外键关系,则此代码将成功运行:

create table dbo.foo (
  colA int not null identity,
  colB varchar(10),
  constraint PK_foo primary key (colA)
);

create table dbo.bar(
  colC int not null,
  --constraint FK_bar_colC_foo_colA foreign key (colC) references dbo.foo (colA)
);

insert dbo.foo (colB)
  output inserted.colA into dbo.bar (colC)
  values ('x');

select * from dbo.foo;
select * from dbo.bar;
colA  colB
----- -----
    1 x

colC
-----
    1

推荐阅读