2011-01-01 8 views
4

に警告/エラーを与えるものではありませんが、私が作った表である。のMySQL:外部キーを追加すると、ここでMyISAMテーブル

mysql> show create table notes; 
+-------+----------------------------------------------------+ 
| Table | Create Table                                                                                     | 
+-------+----------------------------------------------------+ 
| notes | CREATE TABLE `notes` (
    `id` int(11) NOT NULL auto_increment, 
    `note` text NOT NULL, 
    `status` enum('active','hidden','deleted','followup','starred') default NULL, 
    `created` datetime NOT NULL, 
    `last_updated` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 | 
+-------+----------------------------------------+ 

私は外部キー制約を追加しよう:

mysql> alter table notes add constraint foreign key(`id`) references `notetypes`.`id` on update cascade on delete restrict; 
Query OK, 0 rows affected (0.15 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

エラーなしを!警告はありません!この理由のため、私は外部キーなしで内部データベースを使用していました(存在していると仮定して)。これがバグか何か間違っているのかどうか?このような落とし穴を避けるための回避策やオプションはmysqlにありますか?


$ mysql --version 
mysql Ver 14.12 Distrib 5.0.75, for debian-linux-gnu (i486) using readline 5.2 

おかげ

JP

+1

私の知る限りでは、myISAMは参照整合性を行っていません...わからないので、これは単なるコメントです。 – markus

+0

正確です。私は間違いがあったはずだと思った。 –

+0

@tharkun、あなたは正しいです。それはしません。作成されたキーは保存されるので、ユーザーは意図した内容を見ることができます。 –

答えて

4

のMyISAMは、参照整合性を行いません。エンジンがmyISAMである限り、制約は適用されませんが、そのような制約を追加することは合理的であり、したがってエラーはないようです。作成されたキーは保存されるので、ユーザーは意図した内容を見ることができます。 InnoDBは、例えば、トランザクション外部キー、及びロック行を可能にするよう

+0

を使用してください。 – markus

4

InnoDBエンジンは、一般に、(インスタンス用全文インデックスを持っていない限り)、好まれるべきです。テスト・データベースで

ALTER TABLE notes ENGINE = InnoDB; 
    ALTER TABLE notetypes ENGINE = InnoDB; 

(およびその他の関連 - 多分すべて - テーブル)を行う

、あなたが任意の副作用を持っていないことを確認(Mysql Alter Tableを参照してください)。

InnoDB固有のパラメータも確認してください(my.sql)。Mysql InnoDB engineも参照してください。

関連する問題