PostgreSQL insert update 语句

65 阅读1分钟

在 PostgreSQL 中,虽然没有直接的 INSERT UPDATE 语句,但你可以使用 INSERT ... ON CONFLICT DO UPDATE 语法来实现插入或更新的功能。这个语法允许你尝试插入一行数据,如果违反了唯一约束(例如主键或唯一索引),则执行一个更新操作。

下面是一个使用 INSERT ... ON CONFLICT DO UPDATE 的示例:

假设我们有一个 students 表,其中包含学生的 id(主键)、name 和 score: CREATE TABLE students ( id SERIAL PRIMARY KEY, name VARCHAR(50) UNIQUE, score INTEGER );

现在,我们可以使用 INSERT ... ON CONFLICT DO UPDATE 语句来尝试插入一个学生,如果该学生的 name 已经存在,则更新其 score: INSERT INTO students (name, score) VALUES ('Alice', 90) ON CONFLICT (name) DO UPDATE SET score = EXCLUDED.score;

在这个示例中,如果表 students 中已经存在一个名为 'Alice' 的学生,则该学生的 score 将被更新为 90。如果 'Alice' 还不存在,则会插入一个新记录。

EXCLUDED 是一个特殊的表,它表示了尝试插入的数据行。在 ON CONFLICT DO UPDATE 子句中,你可以使用 EXCLUDED 来引用这些数据,以便在更新操作中使用它们。

注意:这个特性在 PostgreSQL 9.5 及更高版本中可用。如果你使用的是较旧版本的 PostgreSQL,你可能需要编写更复杂的逻辑(例如使用 INSERT、UPDATE 和 SELECT 的组合)来实现相同的功能。