PostgreSQL中能否在同一条查询语句中完成一表插入和另一表查询操作
结论
可以实现,不同数据库支持的实现方式有区别,以下分场景给出对应方案:
前置说明
你提供的示例语句逻辑和你描述的需求相反:
你描述的需求是向table2插入数据,同时查询table1中id匹配的指定列,但示例语句是往table1插入数据后查询table2,下面两种场景都覆盖:
场景1:插入table2时直接取table1的匹配id作为字段值
用所有关系型数据库都支持的INSERT ... SELECT语法即可,单条SQL完成需求:
INSERT INTO table2 (name, id, contact) -- 这里SELECT的列顺序和插入的字段顺序一一对应即可,固定值可以直接写在SELECT列表里 SELECT 'ABC', id, 1234 FROM table1 WHERE id = 'QWERTY';
执行时会先从table1查询到符合条件的id,再把对应值和你指定的name、contact拼接后插入table2。
场景2:和你的示例逻辑一致:先往table1插入数据,立刻查询table2中同id的结果
这个需要看你使用的数据库类型:
- 如果你用PostgreSQL、Oracle 12c+、SQL Server这类支持
RETURNING/OUTPUT子句的数据库,可以用CTE+RETURNING实现严格单条SQL完成操作:
WITH inserted_data AS ( -- 先执行插入,返回生成的id INSERT INTO table1 (name, id, contact) VALUES ('ABC', 'QWERTY', 1234) RETURNING id ) -- 用插入的id关联查询table2 SELECT t2.* FROM inserted_data i INNER JOIN table2 t2 ON i.id = t2.id;
- 如果你用的是MySQL,本身不支持INSERT语句返回查询结果,你可以开启多语句执行支持,单次请求提交两个语句实现:
INSERT INTO table1 (name, id, contact) VALUES ('ABC', 'QWERTY', 1234); SELECT * FROM table2 WHERE id = 'QWERTY';
如果id是自增主键而不是你手动指定的固定值,可以用2637547函数获取刚插入的id做关联查询。
内容的提问来源于stack exchange,提问作者era s'q
相关产品推荐
相关产品推荐

