2017-03-17 9 views
0

私は、ユーザー名は一意であると言いますが、1人のクエリで多数のユーザーを挿入する必要があります。ユーザー名が既に存在する場合、各ユーザーを確認する最善の方法は何でしょうか? PostgreSQLを使用する。PostgreSQLの複数行のユニークなデータを確認してください

+0

1つのクエリで「挿入」を実行する唯一の方法は、ステージングテーブルを使用して結合し、新しいユーザーが単一の挿入クエリに含まれているかどうかを確認することです。 – Hogan

+0

ありがとうございました。もっと具体的に教えていただけますか?パフォーマンスはどうですか? – SomethingElse

答えて

1

PRIMARY KEYは、エンジンが余分な手間

alter table table_name add primary key (username); 

とあなたのためのチェックを行いますすでにPKを持っている場合のように、1だけで

alter table table_name add constraint constraint_name UNIQUE (username); 
+0

私はすでにそれを持っています。しかし、重複や挿入が失敗した場合の対処方法は正しいですか? – SomethingElse

+0

@SomethingElseはい、それは – cur4so

2

制約を追加することができ、あなたのユーザ名を設定しましたon conflict句を使用することができます。

create table my_table(id serial primary key, user_name text unique); 
insert into my_table (user_name) values 
('John'), ('Ben'), ('Alice'), ('John'), ('Ben'), ('Alice'), ('Sam') 
on conflict do nothing; 

select * 
from my_table; 

id | user_name 
----+----------- 
    1 | John 
    2 | Ben 
    3 | Alice 
    7 | Sam 
(4 rows)  

最後の行に、主キーのシーケンスが3回更新されていることに注意してください。

Check the syntax of on conflict

+0

こんにちは!答えてくれてありがとう。重複行があることを管理者に通知する必要がある場合はどうすればよいですか? – SomethingElse

+0

挿入を手動で制御したい場合は、重複して行を自動的にスキップ(または更新)するために追加されているので、 'on conflict'は使用しないでください。この構造の矛盾について通知する手段はありません。 – klin

1

挿入されていない行だけが表示されているか、存在している行だけを表示するかどうかは不明です。しかし、両方の要件は、writeable CTEsを使用して行うことができます持っているそれらの行を表示するには

insert into some_table (user_name) 
values 
    ('Tom'), ('Dick'), ('Harry'), ('Arthur'), ('Mary'), ('Ford'), ('Tom'), ('Zaphod') 
on conflict do nothing 
returning user_name; 

:挿入されている(のみ)それらの行を表示するには

create table some_table (id serial primary key, user_name text unique); 

:以下の表を想定し

が挿入されていません。

with new_data (name) as (
    values 
    ('Tom'), ('Dick'), ('Harry'), ('Arthur'), ('Mary'), ('Ford'), ('Tom'), ('Zaphod') 
), inserted as (
    insert into some_table (user_name) 
    select name 
    from new_data 
    on conflict do nothing 
    returning user_name 
) 
select * 
from new_data 
where name not in (select user_name from inserted); 
関連する問題