0
Table: User

     uid = Integer

     superuser = Boolean
Table: Group

     gid = Integer

     grpname = String


Table: User_Group_Rel 

       uid: ForeigneKey(User)

       gid: ForeignKey(Group) 

       CONSTRAINT check1 CHECK (uid.superuser != False),  

リレーショナルテーブルにデータを挿入すると、制約の例外が発生しません

4

1 に答える 1

2

残念ながら、MySQL はチェック制約を強制しません。チェック制約宣言を解析しますが、黙って無視します。そうしているという警告さえ生成しません。

http://dev.mysql.com/doc/refman/5.1/en/create-table.htmlを参照してください:

CHECK 句は解析されますが、すべてのストレージ エンジンによって無視されます。

人々は、列を制約するためにさまざまな回避策を使用します。次に例を示します。

  • 許可する値のみを持つ ENUM として列を宣言します。

  • FOREIGN KEY を定義して、許可する値のみを含むルックアップ テーブルを列が参照するようにします。

  • BEFORE INSERT および BEFORE UPDATE に TRIGGER を記述して、値を変更するか、例外を発生させます (これには、MySQL 5.5 より前ではさらにトリックが必要です)。

于 2011-09-12T07:00:20.647 に答える