我有3个SQL语句,我想组合成一个,所以我不必从我的程序(java)向我的数据库发出多个请求。 我的DB是PostgreSQL 9.4
首先在umgmt_users
中创建一个新用户INSERT INTO umgmt_users ("user") VALUES ('test1')
第二个获取该用户的id(db是postgres,id数据类型是serial,因此它会自动分配给我/ programm不知道用户将获得什么ID
SELECT umgmt_users.id
FROM umgmt_users
WHERE umgmt_users.user = 'test1'
Thrird是将刚刚创建的用户的id(我需要第二个语句)和其他一些值添加到另一个表中
INSERT INTO
umgmt_user_oe_fac_role ("user_id", "oe_id", "fac_id", "role_id")
VALUES ('ID OF USER test1 created in first statement', '1', '2', '1');
有没有办法将所有三种语句合二为一?
我对SQL不是很擅长,我试图在select中加上括号并将其放入insert&还看了UNION和WITH但是无法让它工作......
编辑:结束使用a_horse_with_no_name
中的此解决方案with new_user as (
INSERT INTO umgmt_users ("user") VALUES ('test1')
returning id
)
INSERT INTO umgmt_user_oe_fac_role (user_id, oe_id, fac_id, role_id)
SELECT id, 1, 2, 1
FROM new_user;
答案 0 :(得分:1)
您只需要两个插页:
INSERT INTO umgmt_users ("user") VALUES ('test1');
INSERT INTO umgmt_user_oe_fac_role (user_id, oe_id, fac_id, role_id)
VALUES (lastval(), 1, 2, 1);
为了使lastval()
正常工作,两个插入之间必须没有其他语句,并且具有才能在单个事务中运行(因此需要关闭自动提交)
或者,您可以使用数据修改CTE,然后将其作为单个语句执行:
with new_user as (
INSERT INTO umgmt_users ("user") VALUES ('test1')
returning id
)
INSERT INTO umgmt_user_oe_fac_role (user_id, oe_id, fac_id, role_id)
SELECT id, 1, 2, 1
FROM new_user;
请不要将数字用单引号括起来。
答案 1 :(得分:-2)
答案是:将这些组合成一个普通的ANSI SQL语句是不可能的。
第一个和第三个完全讨论两个不同的表格。 第二个是Select语句,它是与其他两个语句不同的语句类型。