2009-06-24 13 views
1

では動作しませんなぜ私は次の制約を持つ2つのテーブルのORDERSとORDERITEMSを作成しました:私はORDERSテーブルに一つのエントリを削除したいし、その注文IDがORDERITEMSテーブルで使用されている場合は、私は、FK制約は、MySQL

alter table OrderItems add constraint FK_Reference_30 foreign key (orderId) 
    references Orders (orderId) on delete restrict on update restrict; 

エラーや警告が出るはずです。しかし、実際には何も得られませんでした。 ORDERSに2行、ORDERITEMSに数行を挿入しました。 ORDERSのすべての行を削除しようとしたとき、私はそれをやりました。申し立てはありません。私はToad with MySQLでMySQLデータベースを使用しています。

答えて

5

私はあなたがMyISAMテーブルを使用していると思います。

"SHOW CREATE TABLE OrderItems"を実行すると、外部キー定義の記録に失敗したことがわかります。

MyISAMテーブルは外部キーをサポートしていません。 MySQLは構文を解析しますが、MyISAMの使用時にはそれを黙って破棄します。 OrdersとOrderItemsの両方にInnoDBテーブルを使用すると、これはうまくいくでしょう。


デフォルトでは、InnoDBが有効になっているはずです。それが無効になるのは珍しいことです。あなたはこの方法を行うことを確認することができます

mysql> show variables like 'have_innodb'; 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| have_innodb | YES | 
+---------------+-------+ 

それが本当なら、あなたは​​ときCREATEALTERテーブルを指定することができます。

mysql> ALTER TABLE Orders ENGINE=INNODB; 
mysql> ALTER TABLE OrderItems ENGINE=INNODB; 

は、それが成功したことを再確認してください、 SHOW CREATE TABLE <name>となります。

これで制約を追加できます。これは有効です。

+0

InnoDBを有効にするにはどうすればよいですか?私はmy.ini(WindowsXPマシンで)のInnoDBに関連するコメントを解除できますが、私は他のことをする必要がありますか?私は--innodbオプションを使ってMySQL – 5YrsLaterDBA

+0

の手動インストールバージョンを使用していますか? like:mysqld-nt --install --innodb – 5YrsLaterDBA

1

どのデータベースエンジンを使用していますか? InnoDBは、外部キー制約をサポートする唯一のものです。