0

追加中に外部キーエラーが発生しました。私は持っている:

CREATE TABLE PRODUCT_1( PROD_ID NUMERIC(5) NOT NULL PRIMARY KEY,
  PROD_NAME CHAR(20), 
  PROD_DESC CHAR(20),  
  PROD_PRICE NUMERIC(20), 
  SIZE_ID NUMERIC(5) NOT NULL, 
  PROD_CAT_ID CHAR(5));


CREATE TABLE SIZE( 
  SIZE_ID NUMERIC(5) NOT NULL PRIMARY KEY, 
  SIZE_SMALL CHAR(2), 
  SIZE_MEDIUM CHAR(2), 
  SIZE_LARGE CHAR(2));

次を使用して外部キーを追加しようとしています:

テーブル SIZE を変更 外部キー (SIZE_ID) を追加 PRODUCT_1 (SIZE_ID) を参照

しかし、次のエラーが表示されます: ERROR 1005 (HY000): テーブル './mmmm/#sql-842_33e1.frm' を作成できません (errno: 150)

ただし、逆の場合は次のようになります。

テーブル PRODUCT_1 を変更 外部キー (SIZE_ID) を追加 参照 SIZE(SIZE_ID)

「子テーブルを更新できません」などのエラーが表示される場所にデータを追加できません。

どんな助けでも大歓迎です!

4

2 に答える 2

1

PRODUCT_1.SIZE_ID は、この例では外部キーであり、他のテーブルの主キーである SIZE を参照しています。したがって、2 番目の ALTER TABLE ステートメントは PRODUCT_1 テーブルのプロパティであるため、正しいものです。

ここで、PRODUCT_1 テーブルに行を挿入する前に、テーブル SIZE に、新しい行で参照される SIZE_ID を持つレコードが既にあることを確認する必要があります。SIZE テーブルに存在しない SIZE_ID を持つ行を挿入しようとしていることがデータベースによって検出された場合、FOREIGN KEY 制約に違反しているため、許可されません。

于 2012-11-28T21:01:26.560 に答える
1

それは正しいです。SIZE_ID は、SIZE テーブルの「主キー」であるため、PRODUCT_1 の「外部キー」です。外部キー制約を SIZE に追加しようとしても意味がありません。

SHOW INNODB STATUS を実行すると、必要なインデックスがないことを示す情報が得られますが、論理的には、その制約を作成しようとする理由はありません。

ただし、PRODUCT_1 で制約を作成する必要があります。その時点で、すでに SIZE に存在する PRODUCT_1 の SIZE_ID 値のみを入力できます。これは、典型的な「ルックアップ テーブル」設計であるためです。

于 2012-11-28T20:56:48.917 に答える