6

mysql 内に新しいテーブルを作成しており、フィールドの 1 つに外部キー制約を追加しようとしています。

CREATE TABLE `onlineorder` (
  `receiptid` varchar(10) NOT NULL デフォルト '',
  `delivereddate` 日付のデフォルト NULL、
  `cid` int(10) NOT NULL,
  `card#` int(10) デフォルト NULL,
  `expire` 日付のデフォルトは NULL、
  PRIMARY KEY (`receiptid`),
  FOREIGN KEY (receiptid) REFERENCES 購入
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

ただし、作成後、phpMyAdmin に移動してテーブルをエクスポートします。外部キー制約がなくなったようです。

CREATE TABLE `onlineorder` (
  `receiptid` varchar(10) NOT NULL デフォルト '',
  `delivereddate` 日付のデフォルト NULL、
  `cid` int(10) NOT NULL,
  `card#` int(10) デフォルト NULL,
  `expire` 日付のデフォルトは NULL、
  PRIMARY KEY (`領収書`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

phpMyAdmin は外部キーを削除しますか、それともここで何か間違ったことをしていますか?

4

4 に答える 4

8

外部キーを取得するには、InnoDB エンジンを使用する必要があります。

参照: http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html

于 2008-11-17T20:18:15.043 に答える
6

MyISAM ストレージ エンジンでテーブルを定義すると、制約は受け入れられFOREIGN KEYますが、黙って破棄されます。それらを解析しますが、テーブル メタデータに制約を格納せず、その後、制約を適用できません。データベースのテーブル定義の考え方を調べるように依頼すると、データベースはその制約について何も知らないことがわかりました。

CHECK制約でも同じことが起こります (ストレージ エンジンに関係なく)。構文を解析して受け入れますが、無視します。

私見ですが、これは MySQL 製品が行うにはひどいことです。エラーなしで標準 SQL を受け入れ、標準的な方法で制約をサポートするという印象を与えます。しかし、そうではありません!MySQL が制約を無視したことさえSHOW WARNINGS明らかにしません。

InnoDB ストレージ エンジンを使用する場合は、外部キーの制約が考慮されます。

于 2008-11-17T23:10:24.320 に答える
1

また、PHPMyAdmin は、すべてのテーブルが作成され、データが挿入されるまで、すべての CONSTRAINTS の抽出を削除します。as PHPMySql を使用してテーブルをダンプすると、ファイルの最後に、すべての ADD CONSTRAINT エントリを含む UPDATE テーブル セクションが見つかります。

于 2011-05-19T20:28:19.000 に答える