2

MySQL Workbench で SQL エディターを使用しているときに、実行時に外部キー制約が無視されているように見える奇妙なことに遭遇しました。次に例を示します。

create database testdb;

use testdb;

create table t1 (
 `test` INT,
 PRIMARY KEY (`test`)
) ENGINE = InnoDB;

create table t2 (
`test1` INT,
`test2` INT,
 FOREIGN KEY (`test2`) REFERENCES t1(test),
PRIMARY KEY (`test1`)
) ENGINE = InnoDB;

insert into t1 values (1);

insert into t2 values (1,1);
insert into t2 values (2,2);

この例でinsert into t2 values (2,2);は、列テストが 2 である t1 に行がないため、失敗するはずです。

phpMyAdminでテストしましたが、正しく失敗し、外部キー制約に違反しているというエラーが発生しましたが、MySQL Workbenchではエラーは発生せず、テーブルに挿入されました(phpMyAdminで確認しました) .

別のクライアントを使用してSQLを入力できるので、私にとっては大きな問題ではありませんが、外部キーについての私の理解では、参照先のテーブルに値が存在する必要があるため、これが機能する理由に興味があります。

MySQL のバージョンは 5.5.16、エンジンは InnoDB です。

4

3 に答える 3

0

外部キー制約とは別にテーブルを作成することをお勧めします。Workbench での私の経験では、これらは fk 制約で留意すべき事項です。

  • 両方のテーブルがInnoDB
  • データ型は正確に一致する必要があります (デフォルト値を含む)
  • 外部キーがまだ存在していないことを確認してください。

    SELECT * FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = DATABASE()

  • 参照されるキーは一意のキーである必要があります

  • ワークベンチの出力でエラーを確認します

次のように FK 制約を作成してみます。

CREATE TABLE t1 (
 `test` INT,
 PRIMARY KEY (`test`)
) ENGINE = InnoDB;

INSERT INTO t1 VALUES (5);

CREATE TABLE t2 (
`test1` INT,
`test2` INT,
PRIMARY KEY (`test1`)
) ENGINE = InnoDB;

ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY (test2) REFERENCES t1 (test);

次に、テストできます。

INSERT INTO t2 VALUES (1, 4);

子行を追加または更新できません: 外部キー制約が失敗しました .... CONSTRAINT t2_ibfk_1FOREIGN KEY ( test2) REFERENCES t1( test)):

于 2012-09-11T15:33:03.220 に答える