簡體   English   中英

在 PostgresSQL 上添加/更新大數據的問題

[英]Problems Add/Update Big Data on PostgresSQL

我想向表中添加大量數據。 在添加之前,我會檢查表中是否存在數據。

我正在處理以下問題:

例子:

users

id | name | address

.. | .... | .......

select id from users where id = ... and name = ...

if not exist

insert....

if exist

update ....

我的問題是時間太長了。 不知道大家有沒有辦法更快的解決這個問題?

您實際上不需要手動執行此檢查 它是約束的工作,例如通過主鍵。

具有基於idname的主鍵約束的表:

CREATE TABLE users (
id INT, name TEXT, address TEXT,
PRIMARY KEY (id,name));

因此,如果您嘗試插入兩個具有相同idname記錄,您將收到一個異常 - 下面的錯誤消息是德語,但它基本上表示違反了 pk 約束:

INSERT INTO users VALUES (1,'foo','add 1');
INSERT INTO users VALUES (1,'foo','add 2');

FEHLER:  doppelter Schlüsselwert verletzt Unique-Constraint »users_pkey«
DETAIL:  Schlüssel »(id, name)=(1, foo)« existiert bereits.

如果您想在idname已經存在時更新address ,請嘗試使用UPSERT

INSERT INTO users VALUES (1,'foo','add x')
ON CONFLICT (id, name) 
DO UPDATE SET address = EXCLUDED.address;

如果您想簡單地忽略沖突的插入而不引發異常,請執行以下操作:

INSERT INTO users VALUES (1,'foo','add x')
ON CONFLICT DO NOTHING;

有關更多詳細信息,請參閱此answer

關於速度:您必須檢查您的表是否有正確的索引,或者在執行插入時索引是否有意義。 有時將大量數據導入到沒有索引的臨時UNLOGGED TABLE表中,然后使用 SQL 刪除重復項填充目標表是最好的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM