在 PostgreSQL 9.5 及以上版本中,可以使用 `INSERT INTO ... ON CONFLICT` 语法实现插入新记录或更新现有记录。
该语法使用唯一约束(如 PRIMARY KEY 或 UNIQUE 索引)的冲突解决机制来确定是插入一条新记录还是更新现有记录。
以下是使用 `INSERT INTO ... ON CONFLICT` 语法的示例:
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...) ON CONFLICT (unique_column) DO UPDATE
SET column1 = excluded.column1, column2 = excluded.column2, ...;
在上面的示例中,`table_name` 是要插入数据的表的名称,
`column1, column2, ...` 是要插入的列名,
`value1, value2, ...` 是要插入的对应的值。
`unique_column` 表示与唯一约束相对应的列,即如果在插入记录时该列的值与现有记录相同,则会触发冲突。 在 `ON CONFLICT` 子句之后,可以使用 `DO UPDATE` 子句来指定如何更新现有记录。
`excluded` 是一个伪行变量,代表将要插入的行数据。
通过 `excluded` 可以访问将要插入记录的列值,从而在发生冲突时进行更新。 需要注意的是,使用 `ON CONFLICT` 语法的部分是原子的。实际上,该语法执行以下两个操作中的一个:要么将新行插入到该表中,要么更新现有行。如果更新操作失败,则整个操作将被回滚,即任何插入的行都将不被保留。
您可以在官方 PostgreSQL 文档中了解更多关于 `INSERT INTO ... ON CONFLICT` 语法的详细信息。