📜  插入或忽略 postgres - SQL (1)

📅  最后修改于: 2023-12-03 15:10:11.577000             🧑  作者: Mango

插入或忽略 postgres - SQL

在 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 语法,我们可以插入数据时忽略或更新冲突的行。这个语法非常强大,并且可以用来处理各种数据插入问题。