0

データベースを作成しようとしていますが、テーブルの 1 つが複合主キーを使用しています。2番目の複合キーを使用して別のテーブルへの外部キーを作成しようとするまで、これはうまく機能します。表示されるエラーは「ERROR 1005 (HY000): テーブル '.kesharaproducts\production.frm' を作成できません (errno: 150)」です。

これがコードです。

create table stocks(
rawMatBatchID VARCHAR(4) NOT NULL,
finishedGoodsBatchID VARCHAR(4) NOT NULL,
rawMaterialID VARCHAR(4) NOT NULL,
finishedMaterialID VARCHAR(4) NOT NULL,
supplierID VARCHAR(5) NOT NULL,
rawMaterialType VARCHAR(10) NOT NULL,
finishedMaterialType VARCHAR(10) NOT NULL,
rawMatWeight VARCHAR(5) NOT NULL,
finishedGoodsWeightKg INT(5) NOT NULL,
finishedGoodsWeightG INT(5) NOT NULL,
finishedGoodsUnits INT(5) NOT NULL,
finishedGoodsDate VARCHAR(15) NOT NULL,
rawMatDate VARCHAR(15) NOT NULL,
PRIMARY KEY (finishedGoodsBatchID, rawMatBatchID),
CONSTRAINT FOREIGN KEY (finishedMaterialID) REFERENCES finishedMaterials(finishedMaterialID),
CONSTRAINT FOREIGN KEY (supplierID) REFERENCES supplierDetails(supplierID),
CONSTRAINT FOREIGN KEY (rawMaterialID) REFERENCES rawMaterials(rawMaterialID))ENGINE=INNODB;

上記の表では、複合主キーを使用しています。

create table transport(
transportID VARCHAR(4) NOT NULL,
vehicleID VARCHAR(4) NOT NULL,
finishedGoodsBatchID VARCHAR(4) NOT NULL,
finishedGoodsUnits INT(5) NOT NULL,
finishedGoodsWeightKg INT(5),
finishedGoodsWeightG INT(5),
transportDate VARCHAR(15),
CONSTRAINT PRIMARY KEY (transportID),
CONSTRAINT FOREIGN KEY (vehicleID) REFERENCES vehicles(vehicleID),
CONSTRAINT FOREIGN KEY (finishedGoodsBatchID) REFERENCES stocks(finishedGoodsBatchID)
)ENGINE=INNODB;

上記の表は最初の複合キーを使用しており、正常に動作します。

create table production(
productionBatchID VARCHAR(4) NOT NULL,
finishedMaterialID VARCHAR(4) NOT NULL,
rawMaterialID VARCHAR(4) NOT NULL,
productionDate VARCHAR(15),
rawMatBatchID VARCHAR(4),
initialWeight INT(5),
beforeWeight INT(5),
afterWeight INT(5),
finalWeight INT(5),
packingWeight INT(5),
noOfUnits INT(5),
wastage INT(5),
CONSTRAINT PRIMARY KEY (productionBatchID),
CONSTRAINT FOREIGN KEY (finishedMaterialID) REFERENCES finishedMaterials(finishedMaterialID),
CONSTRAINT FOREIGN KEY (rawMaterialID) REFERENCES rawMaterials(rawMaterialID),
CONSTRAINT FOREIGN KEY (rawMatBatchID) REFERENCES stocks(rawMatBatchID))ENGINE=INNODB;

しかし、2 番目の複合プライマリを外部キーとして使用する上記の表では、エラーが発生します。これを修正する方法は?これらは最後の 3 つのテーブルです。他のすべての参照テーブルが作成されます。ここにすべてのテーブルを投稿しませんでした。長すぎます。最後のテーブルから「CONSTRAINT FOREIGN KEY (rawMatBatchID) REFERENCES stocks(rawMatBatchID)」を削除し、テーブルを追加すると、追加されます。しかし、2番目の複合キーへの紹介ではありません...

4

3 に答える 3

1

外部キーには、参照する主キーと同じ列のペアが必要です。

テーブルが機能した理由transportは、 InnoDB が SQL の面白い非標準拡張機能をサポートしているため、外部キーが複合キーの 1 つの列を参照できるようにするためですが、列の左側のサブセットを参照する場合に限られます

productionテーブルは、参照される主キーの2 番目の列のみを参照しており、そのようには機能しません。

このデザインで何をしようとしているのかわからない。列のサブセットに対して参照を行う InnoDB の機能にもかかわらず、これは非標準の SQL であり、推奨されません。

それを参照する両方のテーブルに主キーの両方の列を追加し、複合主キーを参照する複合外部キーを作成する方がよいでしょう。stocks

于 2013-05-19T19:48:31.933 に答える
1

テーブルstocks には 2 つの主キーがありません。唯一無二の存在です。これは、2 つの部分で構成される複合キーです(finishedGoodsBatchID, rawMatBatchID)

FOREIGN KEYテーブルを参照する制約が必要な場合は、そのテーブルの主キー (または一意のキー) を参照する必要があります。それの全体。したがって、この場合、複合主キー全体でstocksあり、その一部ではありません。

これにより、外部キーもtransport間違ったものになります。MySQL では許可されていますが、このままにしておくと問題が発生します。外部キーは、親テーブル内の行を何らかの形で識別できるはずですが、(finishedGoodsBatchID)単独で (行を識別) することはできません。

したがって、transport定義は次のようになります。

CREATE TABLE transport(
    transportID VARCHAR(4) NOT NULL,
    vehicleID VARCHAR(4) NOT NULL,
    finishedGoodsBatchID VARCHAR(4) NOT NULL,
    rawMatBatchID VARCHAR(4) NOT NULL,                            -- added
    finishedGoodsUnits INT(5) NOT NULL,
    finishedGoodsWeightKg INT(5),
    finishedGoodsWeightG INT(5),
    transportDate VARCHAR(15),
    CONSTRAINT 
      PRIMARY KEY (transportID),
    CONSTRAINT 
      FOREIGN KEY (vehicleID) 
      REFERENCES vehicles(vehicleID),
    CONSTRAINT                                                    -- changed
      FOREIGN KEY (finishedGoodsBatchID, rawMatBatchID) 
      REFERENCES stocks (finishedGoodsBatchID, rawMatBatchID)
) ENGINE=INNODB;

同様の変更をproductionテーブルの定義にも行う必要があります。

于 2013-05-19T19:49:06.950 に答える
-1

まだそこにないテーブルを参照しています。外部キーを無効にし、テーブルを作成してから、外部キーを再度有効にします。

SET foreign_key_checks = 0;

テーブルを作成...

SET foreign_key_checks = 1;
于 2013-05-19T19:30:02.557 に答える