1

ここに、競合している 2 つのテーブルがあります。

CREATE TABLE visit_physician (
   visit_id INT(11) UNSIGNED NOT NULL,
   physician_id INT(11) UNSIGNED NOT NULL,
   physician_role INT(11) UNSIGNED NOT NULL,
   PRIMARY KEY(visit_id, physician_id)
);

CREATE TABLE physician_role (
   id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT KEY,
   name VARCHAR(50) NOT NULL,
   UNIQUE(name)
);

ALTER TABLE visit_physician
ADD CONSTRAINT FK_roleid
FOREIGN KEY (physician_role) REFERENCES physician_role(id)
ON UPDATE CASCADE
ON DELETE CASCADE;

doctor_role と id は同じデータ型とサイズであり、すべてです..では、なぜ作成しないのですか? 問題なく割り当てられた他の外部キー..

4

2 に答える 2

2

MySQL 5.5.29 でステートメントをテストしましたが、問題なく動作します。外部キーをサポートするには、両方のテーブルで InnoDB ストレージ エンジンを使用する必要があることに注意してください。そうでない場合、MySQL は解析しますが、これらの制約の宣言を無視します。

私のインスタンスでは、デフォルトのストレージ エンジンは InnoDB です。CREATE TABLE ステートメントではストレージ エンジンが指定されていないため、デフォルトが使用されます。環境内のデフォルトのストレージ エンジンを確認します。

mysql> show global variables like 'default_storage_engine';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+

を使用して、テーブルで使用されているストレージ エンジンを確認してくださいSHOW TABLE STATUS LIKE '%physician%'。出力の Engine 列を見てください。

+-----------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| Name            | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation         | Checksum | Create_options | Comment |
+-----------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| physician_role  | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |        16384 |         0 |              1 | 2013-02-25 15:56:26 | NULL        | NULL       | latin1_swedish_ci |     NULL |                |         |
| visit_physician | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |        16384 |         0 |           NULL | 2013-02-25 15:56:26 | NULL        | NULL       | latin1_swedish_ci |     NULL |                |         |
+-----------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+

Engine が MyISAM または別のストレージ エンジンである場合、制約の作成が機能しない可能性があります。

ストレージ エンジンを InnoDB に変更する場合は、次のようにします。

mysql> ALTER TABLE visit_physician ENGINE=InnODB;
mysql> ALTER TABLE physician_role ENGINE=InnODB;

その後、制約の作成を再実行できるはずです。ただし、テーブルに制約を満たさないデータが既にある場合は、問題が発生する可能性があります。

ただし、そのような変更を行う前に、アプリケーションが別のストレージ エンジンで引き続き動作することをテストすることをお勧めします。正常に動作する可能性が非常に高いですが、テストは常に良い考えです。


外部キーを追加しようとするとどうなりますか? 次のようなエラーが表示される場合:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint 
fails (`test`.`#sql-c67_52`, CONSTRAINT `FK_roleid` FOREIGN KEY (`physician_role`) 
REFERENCES `physician_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)

その場合、制約を満たさない値がテーブルに既に存在する可能性があります。

ストレージエンジンとデータ型に関する他の可能性もエラーを引き起こす可能性がありますが、テーブルは両方とも InnoDB であり、データ型は同じように見え、テストすると機能するため、除外しました.

于 2013-02-26T00:04:49.020 に答える
0

1 つのテーブルに 2 つの外部キー制約が関係している可能性があると思いますが、テーブルの作成中にそれらを追加したので、次のように表示されます。

CREATE TABLE visit_physician (
   visit_id INT(11) UNSIGNED NOT NULL,
   physician_id INT(11) UNSIGNED NOT NULL,
   physician_role INT(11) UNSIGNED NOT NULL,
   PRIMARY KEY(visit_id, physician_id),
   CONSTRAINT FOREIGN KEY (physician_id) REFERENCES user (id) ON DELETE CASCADE ON UPDATE CASCADE,
   CONSTRAINT FOREIGN KEY (physician_role) REFERENCES physician_role (id) ON DELETE CASCADE ON UPDATE CASCADE
);

もし誰かが私が抱えていた奇妙な問題を抱えていたら..

于 2013-02-26T01:37:57.397 に答える