📅  最后修改于: 2023-12-03 15:10:11.577000             🧑  作者: Mango
在 Postgres 中,当我们尝试将数据插入到表中时,如果该表中已经存在相同的行,则会出现重复键错误。
为了避免这种情况,Postgres 提供了 INSERT INTO ... ON CONFLICT DO NOTHING/UPDATE 语法,可以在插入数据时忽略或更新冲突的行。下面我们将详细介绍这个语法。
如果你想在插入数据时忽略冲突的行,则可以使用 ON CONFLICT DO NOTHING。例如,在一个名为“users”的表中,有一个唯一索引“email”,如果我们尝试插入一条与现有“email”值重复的数据,则会出现错误:
INSERT INTO users (email, password) VALUES ('test@example.com', 'password123');
出现错误:
ERROR: duplicate key value violates unique constraint "users_email_key"
DETAIL: Key (email)=(test@example.com) already exists.
为了避免这个错误,我们可以使用 ON CONFLICT DO NOTHING:
INSERT INTO users (email, password) VALUES ('test@example.com', 'password123')
ON CONFLICT (email) DO NOTHING;
这个语句将忽略与现有“email”值重复的行,不会出现错误。
如果你想在插入数据时更新冲突的行,而不是忽略它们,则可以使用 ON CONFLICT DO UPDATE。
例如,我们有一个名为“buyers”的表,它有一个唯一索引“email”,也有一个名为“credits”的列。如果我们尝试插入一行,其中“email”与现有值重复,则可以通过将“credits”增加 10 个单位来更新现有行。
INSERT INTO buyers (email, credits) VALUES ('test@example.com', 10)
ON CONFLICT (email) DO UPDATE
SET credits = buyers.credits + EXCLUDED.credits;
在这个例子中,如果现有行的“credits”值为 5,则现有行将被更新为 15。
通过使用 ON CONFLICT DO NOTHING/UPDATE 语法,我们可以插入数据时忽略或更新冲突的行。这个语法非常强大,并且可以用来处理各种数据插入问题。