[英]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 ....
我的問題是時間太長了。 不知道大家有沒有辦法更快的解決這個問題?
您實際上不需要手動執行此檢查。 它是約束的工作,例如通過主鍵。
具有基於id
和name
的主鍵約束的表:
CREATE TABLE users (
id INT, name TEXT, address TEXT,
PRIMARY KEY (id,name));
因此,如果您嘗試插入兩個具有相同id
和name
記錄,您將收到一個異常 - 下面的錯誤消息是德語,但它基本上表示違反了 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.
如果您想在id
和name
已經存在時更新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.