[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 メーリングリストの案内