SQL插入并更新

SQL插入并更新,sql,postgresql,insert-into,Sql,Postgresql,Insert Into,在PostgreSQL中,是否可以同时更新一个表并将数据插入另一个表中 像 您可以在一个事务中执行多个语句,因此它仍然是对数据的原子更改 BEGIN; UPDATE table1 SET column4=true; INSERT into table2 SELECT column1, column2, column3 FROM table 1 WHERE column1="peter"; COMMIT; 无论出于何种原因,如果insert失败,整个事务都将失败,更改将被撤消,包括inse

在PostgreSQL中,是否可以同时更新一个表并将数据插入另一个表中


您可以在一个事务中执行多个语句,因此它仍然是对数据的原子更改

BEGIN;

UPDATE table1
SET column4=true;

INSERT into table2
SELECT column1, column2, column3
FROM table 1
WHERE column1="peter";

COMMIT;

无论出于何种原因,如果insert失败,整个事务都将失败,更改将被撤消,包括insert语句之前执行的更新。

在Postgres 9.1或更高版本上,您可以使用以下内容:

WITH source AS (UPDATE table1
                SET column4=true
                WHERE column1='peter'
                RETURNING column1, column2, column3)
INSERT INTO table2 
SELECT column1, column2, column3
FROM source;

您的Postgres版本?在Postgres 9.1+中,您可以使用CTE在一条语句中执行任意数量的DML。从提交时可见的意义上说,它是原子的,但如果您处于
读取提交的
模式,那么如果其他人在这两条语句之间提交,这两条语句仍然可以看到不同的数据。我会使用至少
repeatable read
隔离,最好是
serializable
。我的意思是原子,整个事务要么成功,要么失败。我的意思是,这将是试图将两个DML语句写入一个语句的目的,对吗?如果您想了解更多信息,请搜索“可写公共表表达式”。它是一个PostgreSQL扩展。虽然它都在一条语句中,但不一定会在
readcommitted
中看到来自同一时刻的相同数据。考虑<代码>可重复读取< /代码>或更大的隔离。
WITH source AS (UPDATE table1
                SET column4=true
                WHERE column1='peter'
                RETURNING column1, column2, column3)
INSERT INTO table2 
SELECT column1, column2, column3
FROM source;