sql-server - 使用 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 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
推荐阅读
- mysql - MariaDB 10.2 / MySQL 5.7 使用通配符删除字段中的文本?
- git - 快速找出 VS Code 中正在跟踪哪个 Git 遥控器?
- windows - 添加 /GENPROFILE 标志后无法打开文件“pgort.llib”
- ruby-on-rails - 如何从另一个 Rails 控制器访问方法
- webgl2 - 为什么使用 isampler2D 导致我的着色器无法在 WebGL2 中编译?
- c# - C# 文本在第一个单词后换行
- python-3.x - 为什么在使用 `=` 时会链接两个 DataFrame?
- python - 如何使 Flask 单元测试来测试登录
- javascript - 为什么当我用cheerio 运行这段代码时没有输出?
- python - Django.db.utils.ProgrammingError:约束不存在