0

この質問が頻繁に投稿されていることは知っています。コードを注意深くチェックしましたが、Foreign Key を使用してテーブルを作成すると、mysql でエラーが発生する理由が見つかりませんでした。

mysql> CREATE TABLE Act_Model(
    -> code VARCHAR(8) NOT NULL,
    -> model VARCHAR(64) NOT NULL,
    -> PRIMARY KEY (code))ENGINE = INNODB;
Query OK, 0 rows affected (0.09 sec)
mysql> CREATE TABLE IBT_ActItem(
    -> model VARCHAR(64) NOT NULL,
    -> flagbit BIGINT(20) UNSIGNED NOT NULL DEFAULT '0',
    -> PRIMARY KEY(model),
    -> FOREIGN KEY( model) REFERENCES Act_Model(model))ENGINE = INNODB;
ERROR 1005 (HY000): Can't create table 'test.ibt_actitem' (errno: 150)
mysql> CREATE TABLE IBT_ActItem(
    -> model VARCHAR(64) NOT NULL,
    -> flagbit BIGINT(20) UNSIGNED NOT NULL DEFAULT '0',
    -> PRIMARY KEY(model))ENGINE = INNODB;
Query OK, 0 rows affected (0.09 sec)

を使用したときshow engins;、 InnoDB の場合、次のようになりました。

| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |

私の間違いがどこにあるかを見つけるのを手伝ってもらえますか? ありがとう

4

2 に答える 2

4

親テーブルのモデル列に一意のインデックスを追加する必要があります。

CREATE TABLE Act_Model(
 code VARCHAR(8) NOT NULL,
 model VARCHAR(64) NOT NULL,
 PRIMARY KEY (code),
 UNIQUE KEY model (model)
 )ENGINE = INNODB;
于 2013-01-11T18:29:47.627 に答える
0

MySQL では、FOREIGN KEY 制約のターゲットである列に UNIQUE KEY または PRIMARY KEY 制約が必要です。

一意のキーを追加するには、次の構文を使用できます。

ALTER TABLE Act_Model ADD CONSTRAINT Act_Model_UX UNIQUE KEY (model) ;

modelテーブルの PRIMARY KEY として定義された列が既にありIBT_ActItemます。

UNIQUE KEY制約を追加し、もう一方のテーブル ( ) の列にFOREIGN KEY制約を追加すると、実質的にこれら 2 つのテーブル間に "1 対 1 (オプション)" の関係が指定されます。 modelAct_Model

UNIQUE (または PRIMARY) KEY は、「1 対多」関係の「1」側である親テーブルに配置されます。FOREIGN KEY は、リレーションシップの「0、1、または多数」側である子テーブルに配置されます。


(規範的な慣行は、外部キーがターゲット テーブルの主キーを参照するようにすることです。model列ではなく列codeを主キーにするには、次のようにします。

ALTER TABLE Act_Model DROP PRIMARY KEY ;
ALTER TABLE Act_Model ADD PRIMARY KEY (model) ;

注: UNIQUE KEY と PRIMARY KEY にはいくつかの重要な違いがあります。たとえば、テーブルに定義できる PRIMARY KEY は 1 つだけであり、PRIMARY KEY 制約は列に NOT NULL 制約を適用します。)

于 2013-01-11T18:34:20.127 に答える