質問
あるベンダーから別のベンダーに製品を発送するのにかかる日数とコストを追跡するテーブルがあります。私たちは (見事に :p) 配送業者 (FedEx、UPS) と製品取り扱い業者 (考えてみてください...) の両方を保管しました。Dunder Mifflin) を「VENDOR」テーブルに追加します。したがって、SHIPPING_DETAILS テーブルには 3 つの列があり、すべて VENDOR.no を参照しています。何らかの理由で、MySQL では 3 つすべてを外部キーとして定義できません。何か案は?
CREATE TABLE SHIPPING_GRID(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique ID for each row',
shipping_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to VENDOR.no for the shipping vendor (vendors_type must be 3)',
start_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to VENDOR.no for the vendor being shipped from',
end_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to the VENDOR.no for the vendor being shipped to',
shipment_duration INT(1) DEFAULT 1 COMMENT 'Duration in whole days shipment will take',
price FLOAT(5,5) NOT NULL COMMENT 'Price in US dollars per shipment lbs (down to 5 decimal places)',
is_flat_rate TINYINT(1) DEFAULT 0 COMMENT '1 if is flat rate regardless of weight, 0 if price is by lbs',
INDEX (shipping_vendor_no),
INDEX (start_vendor_no),
INDEX (end_vendor_no),
FOREIGN KEY (shipping_vendor_no) REFERENCES VENDOR (no),
FOREIGN KEY (start_vendor_no) REFERENCES VENDOR (no),
FOREIGN KEY (end_vendor_no) REFERENCES VENDOR (no)
) TYPE = INNODB;
二重主キー定義を削除するために編集されました...
はい、残念ながらそれでは解決しませんでした。今、私は得ています:
テーブルを作成できません './DB名を削除しました/shipping_grid.frm '(errno:150)
phpinfo() を実行すると、mysql について次のことがわかります。
クライアント API バージョン 5.0.45
はい、VENDOR.no は int(6) 型です。
解決
主キーを 2 回定義しました。試す:
CREATE TABLE SHIPPING_GRID(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique ID for each row',
shipping_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to VENDOR.no for the shipping vendor (vendors_type must be 3)',
start_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to VENDOR.no for the vendor being shipped from',
end_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to the VENDOR.no for the vendor being shipped to',
shipment_duration INT(1) DEFAULT 1 COMMENT 'Duration in whole days shipment will take',
price FLOAT(5,5) NOT NULL COMMENT 'Price in US dollars per shipment lbs (down to 5 decimal places)',
is_flat_rate TINYINT(1) DEFAULT 0 COMMENT '1 if is flat rate regardless of weight, 0 if price is by lbs',
INDEX (shipping_vendor_no),
INDEX (start_vendor_no),
INDEX (end_vendor_no),
FOREIGN KEY (shipping_vendor_no) REFERENCES VENDOR (no),
FOREIGN KEY (start_vendor_no) REFERENCES VENDOR (no),
FOREIGN KEY (end_vendor_no) REFERENCES VENDOR (no)
) TYPE = INNODB;
VENDOR の主キーは INT(6) である必要があり、両方のテーブルのタイプは InnoDB である必要があります。
他のヒント
ここでコードを実行すると、設定していることがエラー メッセージに表示されました (そしてそれは正しいです!) ID フィールドを主キーとして 2 回使用します。
ベンダーテーブルの定義を提供できますか
私はそれを考え出した。VENDOR テーブルは MyISAM でした...(両方をINNODBにするように回答を編集しました;))
(何らかの理由 ない VENDOR タイプを INNODB に切り替えるだけですか?)