[pgsql-jp: 29954] Re: 40万件有るデータから重複をさけて登録する
Satoshi Nagayasu
snaga @ snaga.org
2003年 5月 18日 (日) 11:54:49 JST
永安です。
# SQLは苦手なのですが、、
"k_matsui" <matsui @ tono-k.jp> wrote:
> 初めて質問させて頂きます。マツイと申します。
> postgres初心者ですがよろしくお願いします。
>
> 現在web上からの応募フォームを作成中です。応募フォームをphpで作成し、
> postgresに貯めていくというものです。
> だいた40万件の応募が予想されるのですが、重複したメールアドレスでの
> 再応募が出来ないようにしたいのです。この場合、どのような方法が
> 簡単かつ、実用的でしょうか?尚、応募は3回に分けて行われ、1つの応募に
> 対して1度、計3回のメールアドレスでの応募が可能なようにしたいのですが、
> tableは1つにまとめたいのです。
>
> phpでデータを一度呼び出してメールアドレスをチェックしていたら件数的に実用的
> では
> ないような気がします。
>
> それとも応募期間が終了してから重複したメールアドレスを排除するほうが良い
> でしょうか?
>
> OS:turbolinux
> postgres7.1.3
>
> 良い解決策の解る方、なにとぞご教授お願い致すます。
>
>
いい解決策なのかどうか分からないのですが、
CREATE TABLE t1 (
email text,
count integer,
CONSTRAINT email_count_key PRIMARY KEY ( email, count ),
CONSTRAINT count_check CHECK(count>=0 and count<=2)
);
というようなテーブルを作って、
1.) count を 0 にして INSERT
2.) 1.)に失敗したら、count を 1 にして INSERT
3.) 2.)に失敗したら、count を 2 にして INSERT
4.) 3.)に失敗したら、4回目なのでエラー
というのはどうでしょうか?
とりあえず、遊んでみたんですが、以下のようになりました。
snaga=# \d t1
Table "t1"
Column | Type | Modifiers
--------+---------+-----------
email | text | not null
count | integer | not null
Primary key: email_count_key
Check constraints: "count_check" ((count >= 0) AND (count <= 2))
snaga=# insert into t1 values ( 'snaga @ snaga.org', 0);
INSERT 7327403 1
snaga=# insert into t1 values ( 'snaga @ snaga.org', 0);
ERROR: Cannot insert a duplicate key into unique index email_count_key
snaga=# insert into t1 values ( 'snaga @ snaga.org', 1);
INSERT 7327405 1
snaga=# insert into t1 values ( 'snaga @ snaga.org', 1);
ERROR: Cannot insert a duplicate key into unique index email_count_key
snaga=# insert into t1 values ( 'snaga @ snaga.org', 2);
INSERT 7327407 1
snaga=# insert into t1 values ( 'snaga @ snaga.org', 2);
ERROR: Cannot insert a duplicate key into unique index email_count_key
snaga=# insert into t1 values ( 'snaga @ snaga.org', 3);
ERROR: ExecAppend: rejected due to CHECK constraint count_check
snaga=#
--
NAGAYASU Satoshi <snaga @ snaga.org>
pgsql-jp メーリングリストの案内