PostgreSQL并发场景处理insert 主键、唯一索引冲突

538 阅读1分钟

on conflict do nothing 是 PostgreSQL 数据库中的一个子句,它用于在插入数据时处理唯一约束冲突。当尝试向表中插入数据时,如果已存在相同的主键或唯一约束,就会触发这个子句。在这种情况下,使用 ON CONFLICT DO NOTHING 会导致插入操作被忽略,并且不会插入任何数据,同时也不会报错。

以下是关于 ON CONFLICT DO NOTHING 的详细解释和示例:

解释 ON CONFLICT:这个子句用于指定在插入数据时如何处理唯一约束冲突。 DO NOTHING:当唯一约束冲突发生时,这个选项会导致插入操作被忽略,并且不会执行任何更新或删除操作。 示例 假设我们有一个名为 students 的表,其中包含学生的 id 和 name,其中 id 是主键,name 有唯一约束。

创建表: CREATE TABLE students ( id SERIAL PRIMARY KEY, name VARCHAR(50) UNIQUE );

插入数据: 首先,我们插入两个学生: INSERT INTO students (name) VALUES ('Alice'), ('Bob');

假设此时表中的数据如下:

idname
1Alice
2Bob

接下来,我们尝试再次插入一个名为 'Alice' 的学生: INSERT INTO students (name) VALUES ('Alice') ON CONFLICT (name) DO NOTHING;

由于 'name' 字段有唯一约束,并且已经存在一个名为 'Alice' 的学生,因此这次插入操作会被忽略,并且表中的数据保持不变。

总结 ON CONFLICT DO NOTHING 是一种在 PostgreSQL 中处理唯一约束冲突的方法,它允许你在插入数据时忽略冲突,而不会插入任何数据或报错。这种方法可以帮助你更好地控制业务流程,避免使用异常来处理这种情况。