0

MySQL データベースのテーブルには、電子メール アドレスの列があります。最終的に、電子メール アドレスは一意であり、有効な形式である必要があります。チェックをどこで行うべきか、どのチェックが必要かを判断するのに苦労しています。

明らかに、SQL だけでは電子メール アドレスを完全に検証することはできませんがNOT NULL、空白の電子メール アドレスが送信されないように制約を追加することを検討していました。各電子メール アドレスは一意でなければならないe-mailため、列を一意のキーにすることは合理的に思えますが、列が一意のキーであるという理由だけではNOT NULL正しくないのでしょうか? 私はおそらく PHP を使用してサーバー上の電子メール アドレスを検証する予定なので、そこで空かどうかを確認することもできます。

私が作成している重要な情報は、一意のキーまたは制約を追加すると検索が速くなったり遅くなったりすることですか?

重複や空の文字列/nullなどがあってはならない電子メールアドレスを保持する列の場合、一意のキーにするか、NOT NULL制約などを与える必要がありますか?

私は MySQL の初心者なので、コード サンプルが役に立ちます。作業が簡単な場合は、phpMyAdmin があります。

私が使用する一意のALTER TABLE USER ADD UNIQUE INDEX(``e-mail``);
場合、nullでない場合に使用しますALTER TABLE user CHANGE ``e-mail`` varchar(254) NOT NULL;

もう 1 つのアイデアは、空の電子メール アドレスを含む行を挿入し、電子メール列を一意にして、他の空の電子メール アドレスを挿入できないようにすることでした。

4

4 に答える 4

1

これまでの回答は良好です。アプリケーションにはUNIQUE KEYandNOT NULLを使用することをお勧めします。またはを使用UNIQUE KEYすると速度が低下する可能性がありますが、検索が遅くなることはありません。INSERTUPDATE

ただし、 を使用しているからとUNIQUE KEYいって、必ずしも一意の電子メール アドレスが強制されるとは限らないことを考慮する必要があります。例として、abc@gmail.com と abc@gmail.com は同じ電子メールを表します。これを許可したくない場合は、電子メール アドレスをデータベースに送信する前に PHP で正規化する必要があります。

于 2013-07-12T19:20:01.247 に答える
1

一意のインデックスを持つフィールドは、引き続き null を許可できます。null は、それ自体を含め、他のものと等しくなることはありません。そのため、複数の null は一意性制約に違反しません。ただし、フィールドを として指定することにより、フィールドでヌルを許可しないようにすることができますNOT NULL

一意のキーは、特定の値の複数のインスタンスを許可しない通常のフィールド インデックスです。挿入/更新がわずかに遅くなるため、キーを更新できますが、(場合によっては) インデックスを使用して検索を高速化できるため、検索は高速になります。

于 2013-07-12T19:12:43.043 に答える
1

一意の制約を追加すると、このフィールドでテーブルのインデックスが作成されるため、実際には検索が高速になります。alter table問題の説明に基づいて、あなたの発言は正しいと思います。

于 2013-07-12T19:12:14.743 に答える