40

MySQL Workbench で小さなデータベースを作成しています。「Immobili」と呼ばれるメイン テーブルがあります。このテーブルには、4 つの列 (Comune、Via、Civico、Immobile) で構成される主キーがあります。

同じ主キー (Comune、Via、Civico、Immobile) を持つ他の 3 つのテーブルもありますが、これらのフィールドも Immobili テーブルを参照しています。

最初の質問: 外部キーでもある主キーを作成できますか?

2 番目の質問: 変更をエクスポートしようとすると、次のように表示されます。

Executing SQL script in server

# ERROR: Error 1005: Can't create table 'dbimmobili.condoni' (errno: 150)

CREATE  TABLE IF NOT EXISTS `dbimmobili`.`Condoni` (

  `ComuneImmobile` VARCHAR(50) NOT NULL ,
  `ViaImmobile` VARCHAR(50) NOT NULL ,
  `CivicoImmobile` VARCHAR(5) NOT NULL ,
  `InternoImmobile` VARCHAR(3) NOT NULL ,
  `ProtocolloNumero` VARCHAR(15) NULL ,
  `DataRichiestaSanatoria` DATE NULL ,
  `DataSanatoria` DATE NULL ,
  `SullePartiEsclusive` TINYINT(1) NULL ,
  `SullePartiComuni` TINYINT(1) NULL ,
  `OblazioneInEuro` DOUBLE NULL ,
  `TecnicoOblazione` VARCHAR(45) NULL ,
  `TelefonoTecnico` VARCHAR(15) NULL ,
  INDEX `ComuneImmobile` (`ComuneImmobile` ASC) ,
  INDEX `ViaImmobile` (`ViaImmobile` ASC) ,
  INDEX `CivicoImmobile` (`CivicoImmobile` ASC) ,
  INDEX `InternoImmobile` (`InternoImmobile` ASC) ,

  PRIMARY KEY (`ComuneImmobile`, `ViaImmobile`, `CivicoImmobile`, `InternoImmobile`) ,

  CONSTRAINT `ComuneImmobile`
    FOREIGN KEY (`ComuneImmobile` )
    REFERENCES `dbimmobili`.`Immobile` (`ComuneImmobile` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,

  CONSTRAINT `ViaImmobile`
    FOREIGN KEY (`ViaImmobile` )
    REFERENCES `dbimmobili`.`Immobile` (`ViaImmobile` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,

  CONSTRAINT `CivicoImmobile`
    FOREIGN KEY (`CivicoImmobile` )
    REFERENCES `dbimmobili`.`Immobile` (`CivicoImmobile` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,

  CONSTRAINT `InternoImmobile`
    FOREIGN KEY (`InternoImmobile` )
    REFERENCES `dbimmobili`.`Immobile` (`InternoImmobile` )
    ON DELETE CASCADE
    ON UPDATE CASCADE
) ENGINE = InnoDB

エンジン ステータスの表示:

テーブル dbimmobili/valutazionimercato の外部キー制約のエラー:

参照される列が最初の列として表示される参照されるテーブルにインデックスが見つからないか、テーブルの列の型と参照されるテーブルが制約に一致しません。>= InnoDB-4.1.12 で作成されたテーブルでは ENUM および SET の内部ストレージ タイプが変更され、古いテーブルのそのような列は新しいテーブルのそのような列によって参照されないことに注意してください。

私はどこで間違っていますか?

4

17 に答える 17

52

外部キー制約を作成する場合、MySQL は参照テーブルと参照テーブルの両方で使用可能なインデックスを必要とします。参照テーブルのインデックスが存在しない場合は自動的に作成されますが、参照テーブルのインデックスは手動で作成する必要があります ( Source )。あなたのものは行方不明のようです。

テストケース:

CREATE TABLE tbl_a (
    id int PRIMARY KEY,
    some_other_id int,
    value int
) ENGINE=INNODB;
Query OK, 0 rows affected (0.10 sec)

CREATE TABLE tbl_b (
    id int PRIMARY KEY,
    a_id int,
    FOREIGN KEY (a_id) REFERENCES tbl_a (some_other_id)
) ENGINE=INNODB;
ERROR 1005 (HY000): Can't create table 'e.tbl_b' (errno: 150)

しかし、 にインデックスを追加するとsome_other_id:

CREATE INDEX ix_some_id ON tbl_a (some_other_id);
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0

CREATE TABLE tbl_b (
    id int PRIMARY KEY,
    a_id int,
    FOREIGN KEY (a_id) REFERENCES tbl_a (some_other_id)
) ENGINE=INNODB;
Query OK, 0 rows affected (0.06 sec)

多くの場合、参照されるフィールドは参照されるテーブルの主キーであり、主キーは自動的にインデックス付けされるため、ほとんどの場合、これは問題になりません。

于 2010-10-31T12:58:16.277 に答える
32

外部キーが、このテーブルにあるフィールドとまったく同じタイプであることを再確認してください。たとえば、どちらも Integer(10) または Varchar (8) で、文字数も同じです。

于 2010-10-31T12:55:40.810 に答える
16

これは古い投稿だと思いますが、Google で上位にランクされているので、私の問題についてわかったことを追加します。テーブル タイプ (MyISAM と InnoDB など) が混在している場合も、このエラーが発生します。この場合、InnoDB がデフォルトのテーブル タイプですが、1 つのテーブルで全文検索が必要だったため、MyISAM に移行されました。この状況では、MyISAM テーブルを参照する InnoDB テーブルに外部キーを作成できません。

于 2013-04-18T13:23:27.620 に答える
9

キーがCHAR/VARCHARまたはそのタイプの何かである場合、別の考えられる問題は異なる照合です。文字セットが同じかどうかを確認します。

于 2013-06-12T10:44:32.280 に答える
9

このエラーが発生し、私の場合はエラーの理由が見つかりました。この古い投稿は Google でかなり上位にランクされているため、まだ回答しています。

リンクしたい両方の列の変数は整数でしたが、int の 1 つは「符号なし」がチェックされていました。チェックを外すだけでエラーが修正されました。

于 2014-04-15T09:47:01.077 に答える
5

同じエラーが発生していました。メインテーブルの主キーをBIGINT UNSIGNEDとして作成し、2番目のテーブルの外部キーとしてBIGINTのみとして宣言していたという解決策を見つけました。

2 番目のテーブルで外部キーを BIGINT UNSIGED として宣言すると、すべてが正常に機能し、インデックスを作成する必要さえありませんでした。

したがって、主キーと外部キーの間のデータ型の不一致でした:)

于 2012-05-22T11:51:26.050 に答える
4

まったく同じ問題がありましたが、問題の解決策はまったく異なりました。データベースの別の場所に、同じ名前の外部キーがありました。これにより、エラー 1005 が発生しました。

外部キーの名前をその状況により具体的な名前に変更すると、問題が解決しました。

于 2013-03-12T09:11:16.817 に答える
3
  1. 両方のテーブルが同じエンジン タイプを使用していることを確認してください。
  2. 索引付けするフィールドのタイプと長さが同じであることを確認してください。
于 2015-04-30T16:19:04.287 に答える
3

私の場合、エラーはreferencingtable is MyISAMwhere as referringtable wasによるものでしたInnoDB

ConvertedからのテーブルエンジンMyISAM to InnoDBが問題を解決します。

ALTER TABLE table_name ENGINE=InnoDB;
于 2016-03-24T20:54:17.897 に答える
1

テーブルを作成するときは、CHARSETおよびCOLLATEパラメータに注意してください。FOREIGN KEYの問題に関しては、次のようなものです。

CREATE TABLE yourTableName (
....
....
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

私の場合、FOREIGN KEY 参照でテーブルを作成できませんでした。最初にエラー コード 1005 が表示されましたが、ほとんど何も表示されませんでした。次に、 COLLATEを追加し、最後に CHARSET に関するエラー メッセージを追加しました。

Error Code: 1253. COLLATION 'utf8_unicode_ci' is not valid for CHARACTER SET 'latin1'

その修正の後、私の問題は解決しました。

于 2016-01-20T14:36:11.717 に答える
0

主キーに 2 つの列がある場合、それらは複合主キーを構成するため、参照されているテーブルにも同じデータ型の 2 つの列があることを確認する必要があります。

于 2012-01-17T07:52:30.000 に答える
0

私にとっては、子テーブルの通常のインデックス付きフィールドを親テーブルの主キーに一致させようとしていました。デフォルトでは、Sequel Pro などの一部の MySQL フロントエンド GUI は主キーを署名なしとして設定しているため、確認する必要があります。子テーブル フィールドも署名されていないことを確認します (これらのフィールドに負の整数が含まれている可能性がある場合を除き、両方が署名されていることを確認してください)。

于 2014-03-05T15:11:41.967 に答える
0

一見適切に形成された FK/PK 関係でこのエラーが発生し、ビジュアル ツールを使用した場合は、問題のある fk 列を削除し、ツールに再度追加してみてください。問題を解決する接続を再描画するまで、このエラーが継続的に発生していました。

于 2012-08-13T00:38:39.253 に答える
0

特定のケースではありませんが、テーブルの主キー全体ではないテーブル内のフィールドを参照しようとすると、このエラーが発生する可能性があることに注意してください。明らかにこれは許可されていません。

于 2011-11-14T10:19:43.763 に答える