mysql:1980
From: とみたまさひろ <とみたまさひろ <tommy@xxxxxxxxxx>>
Date: Tue, 09 May 2000 21:07:34 +0900
Subject: [mysql 01980] Re: AUTO_INCREMENT
とみたです。 At Tue, 09 May 2000 20:24:33 +0900, moeru@xxxxxxxxxx (moeru) wrote: > ぼくは、データベースでの「一意」という意味がよく分かってないみたいです(^^; > > 「一意」がPRIMARY KEY(id)などによって > usersテーブル全体に意味を持たせることができるのか > usersテーブルの中の各フィールドにのみなのかということです。 RDBMS でいうところの「一意」または「ユニーク」というのは、「そのフィール ドにその値を持つレコードは、そのテーブルには1レコードしか存在しない」と いうことです。 つまり、UNIQUE (id) とした場合は、id という名前のフィールドに、ダブった 値を登録することができなくなるので、 mysql> insert into users (id, username) values (99, "hoge"); mysql> insert into users (id, username) values (99, "fuga"); とすると2回目のはエラーになります。 UNIQUE (id, username) とした場合は、id と username を合わせた値が一意に なるので、 mysql> insert into users (id, username) values (99, "hoge"); mysql> insert into users (id, username) values (99, "fuga"); はエラーになりません("99hoge" と "99fuga" は異なるから)。 PRIMARY KEY というのは、MySQL の場合は最初の UNIQUE インデックスという意 味でしかないと思います。 > つまり、このusersテーブルの中で、 > UNIQUE (username)とすれば、この後登録されるであろうユーザー名に > 同じ名前を使うことができないと理解すればいいでしょうか。 そうですね。 > ぼくは、このことをPHPのプログラム側で解決しようと思っていたのですが > これは、データベースの設計上そうしたほうがいいでしょうか。(実行速度的にとか。。) 私だったら、PHP でチェックしてエラーを出しますね。MySQL の insert が失敗 したときにどのようなエラーなのかを判別するのは面倒なので… (^^; > であれば、 > > CREATE TABLE users ( > id INT NOT NULL AUTO_INCREMENT, > username VARCHAR(20) NOT NULL, > password VARCHAR(20), > email VARCHAR(50) NOT NULL, > PRIMARY KEY(id) > UNIQUE (username,email) > ); > > で > INDEX (username) , > INDEX (email) , > はいらないってことですか? > で > usernameに今後同じ名前を許可しない。 > emailに今後同じ名前を許可しない。 その場合は UNIQUE (username), UNIQUE (email) としないといけませんね。 > > それと、うちの場合、詐欺防止に必死なんですが(^^; > > username-Aの人がemail-Aで登録されたとします。 > その後 > username-Aの人がusername-Bで登録して > username-B email-A > > を許可したくない場合 > > UNIQUE (username,email) > > でいいでしょうか? これも UNIQUE (username), UNIQUE (email) でしょう。 -- とみたまさひろ <tommy@xxxxxxxxxx>
1977 2000-05-08 23:37 [<moeru@xxxxxxxxxx> ] AUTO_INCREMENT 1978 2000-05-08 23:53 ┗[とみたまさひろ <tomm] 1979 2000-05-09 20:24 ┗[<moeru@xxxxxxxxxx> ] -> 1980 2000-05-09 21:07 ┗[とみたまさひろ <tomm] 1982 2000-05-09 21:39 ┗[<moeru@xxxxxxxxxx> ]