【问题标题】:Insert a row which contains foreign key that is auto incremented field in Microsoft SQL using JDBC使用 JDBC 插入包含外键的行,该外键是 Microsoft SQL 中自动递增的字段
【发布时间】:2021-07-10 14:35:39
【问题描述】:

我有两个表 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)

【问题讨论】:

  • 您需要使用 2 个插入语句,但可以在单个事务中完成。看到这个答案:stackoverflow.com/a/175138/1073631
  • 谢谢@sgeddes,交易对我的情况有效

标签: sql-server jdbc sql-server-2012


【解决方案1】:

由于 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

【讨论】:

    猜你喜欢
    • 2016-04-22
    • 2016-09-06
    • 2021-12-23
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 2012-12-31
    相关资源
    最近更新 更多