2012-03-02 10 views
2

テーブルに性別フィールドを作成する場合は、データベースで「M」または「F」以外の値を受け入れないようにするにはどうすればよいですか? MySQLの性別テーブルのフィールド

$sqlCommand = "CREATE TABLE members (
      id int(11) NOT NULL auto_increment, 
      ... 
      ... 
      ... 
      ... 
      gender 
      )"; 

あなたは

+0

使用ENUMタイプ(http://dev.mysql.com/doc/refman/ 5.0/en/enum.html) – Aziz

+0

[ENUMタイプを参照](http://dev.mysql.com/doc/refman/5.0/en/enum.html) –

+0

ありがとう! –

答えて

9

ノーtriggers、無enumsまたは他のdeamonic活動を使用することができます。また、アプリケーション・コードが読み取り専用アクセスをしているので、参照テーブルを「ロック」するための良いアドバイスだ

CREATE TABLE Gender_Ref 
( gender CHAR(1) NOT NULL, 
    PRIMARY KEY (gender) 
) ENGINE = InnoDB ; 

INSERT INTO Gender_Ref (gender) 
    VALUES 
     ('F'), ('M') ; 

CREATE TABLE members 
( id int(11) NOT NULL auto_increment, 
    ... 
    ... 
    gender CHAR(1) NOT NULL, 
    PRIMARY KEY (id), 
    FOREIGN KEY gender 
     REFERENCES Gender_Ref (gender) 
) ENGINE = InnoDB ; 

あなたはわずか2行で参照テーブルにFOREIGN KEYを使用することができます。 (これは通常、ほとんどの参照テーブルには適していますが、管理アプリケーションを使用している場合は、もちろん参照テーブルにも書き込みアクセス権を与えることができます)。

gender ENUM('F','M') NOT NULL 

をしかし、あなたは注意する必要があり、あなたがのための警告を取得しますが、これはまだ(あまりにも空の文字列を受け入れるよう:

+0

ENUMの(誤った)使い方を嫌うのと同じくらい、「性別」はENUMが合理的に考えられるケースです。個人的には、db/code/etcのほうがはるかに簡単で、あなたが提案するルックアップテーブルのソリューションよりもはるかに直感的です。 – liquorvicar

+0

このような単純なケースのために私はEnumsも考えています。そして、それらを却下してください:) –

+0

あとでもう少しジェンダーを追加したい場合、これはスキーマの変更を必要としないので、より簡単なオプションです。 :) –

1

あなたはenumタイプenum('M','F')を使用することができますありがとうございます。

+0

ありがとうたくさん:) –

0

は、あなたはそれがcoreectであるかどうかを確認するためにトリガーを使用するか、列挙型enum('M','F')

+0

いくつかの理由で、トリガーの使用を強くお勧めします。無効な値を検出したら、トリガーの中で何をしますか教えてください。どのように更新や挿入が行われないようにしますか? MySQL 5.5では適切な解決策がありましたが、以前のバージョンでは解決されていませんでした。 –

5

同様にあなたがそうのようなENUMを使用することができ、コメントで指摘しました)ということ:

mysql> create table t (g enum('M','F') not null); 
Query OK, 0 rows affected (0.12 sec) 

mysql> insert into t values ('M'); 
Query OK, 1 row affected (0.00 sec) 

mysql> insert into t values (''); 
Query OK, 1 row affected, 1 warning (0.00 sec) 

mysql> show warnings; 
+---------+------+----------------------------------------+ 
| Level | Code | Message        | 
+---------+------+----------------------------------------+ 
| Warning | 1265 | Data truncated for column 'g' at row 1 | 
+---------+------+----------------------------------------+ 
1 row in set (0.00 sec) 

mysql> select * from t; 
+---+ 
| g | 
+---+ 
| M | 
| | 
+---+ 
2 rows in set (0.00 sec) 

はこれが起こらないようにするには、あなたが設定することを検討できsql_mode(http://dev.mysql.com/doc/refman/5.5/en/server-sql-mode.html)より限定的な値:

mysql> set sql_mode = strict_all_tables; 
Query OK, 0 rows affected (0.00 sec) 

mysql> insert into t values (''); 
ERROR 1265 (01000): Data truncated for column 'g' at row 1 

ただし、これが適切なオプションであるかどうかを調査する必要があります。既存の多くのアプリケーション(ワードプレスなど)は、sql_modeを使いこなすのが好きではありません。そのようなシステムへのプラグインであれば、設定しないようにしてください。

sql_modeサーバーをワイドまたはセッションワイドに設定することができます。最初のオプションはより堅牢ですが、デフォルト以外の方法でMySQLを設定する必要があり、他のアプリケーションに影響する可能性があります。接続を開いた直後のセッションレベルでの設定はうまくいくはずですが、アプリケーションコードが乱雑になります。あなたの毒を選ぶ。

外部キーを使用するというypercubeの提案も良いですし、ENUM以外の他のRDBMSより移植性があります。ただし、テーブルがInnoDBエンジンによって管理されていることを確認する必要があります。これはますます標準になっているので、悪い選択ではありません。

(あなたは本当に被害妄想している場合、あなたは本当にアプリケーションのみ性別参照テーブルへのアクセスを読んだことを確認してください)

+0

Thnx、私は私の答えに(パラノイア:)提案を追加します。 –

+0

Heh :)正直言って、ENUMソリューションにも同様のことが当てはまります:アプリケーションユーザはテーブルの定義を変更できません(通常、アプリケーションはランダムなテーブル定義の変更を行うノブを持たない傾向がありますが、一般的なテーブルに依存しないデータアクセスのための機能を持っていることは完全に実現可能です) –

関連する問題