0

新しいデータベースを作成していて、テーブルを作成したいSupplier_StockOut:

CREATE TABLE StockOut_Supplier (
  idStockOut_Supplier INT NOT NULL,
  idStockOut INT NOT NULL,
  idSupplier INT NOT NULL,
  idTransactionType INT NOT NULL,
    FOREIGN KEY (idSupplier) REFERENCES Suppliers(idSupplier)
    ON DELETE SET NULL
    ON UPDATE CASCADE,
  FOREIGN KEY (idStockOut) REFERENCES StockOuts (idStockOut)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  FOREIGN KEY (idTransactionType) REFERENCES TransactionTypes(idTransactionType)
    ON DELETE SET NULL
    ON UPDATE CASCADE
) ENGINE=innodb DEFAULT CHARACTER SET=utf8 COLLATE=utf8_polish_ci;

結果:

ERROR 1005 (HY000): Can't create table 'stocktest.stockout_supplier' (errno: 150)

これらのキーが参照するすべてのテーブルが適切に定義されています。例えば:

CREATE TABLE Suppliers (
  idSupplier INT NOT NULL auto_increment PRIMARY KEY,
  name VARCHAR(64) NOT NULL
) ENGINE=innodb DEFAULT CHARACTER SET=utf8 COLLATE=utf8_polish_ci;

外部キーを 1 つだけ (たとえば、サプライヤーに) 残しても、結果は変わりません。

ALTER TABLE外部キーなしでテーブルを作成しようとしていて、後でそれらを追加しようとすると、同じことが起こります。ON DELETE ON UPDATE句なしでそれらを追加できるが、それらを使用できないことに気付きました。

編集:このサーバーには多くの外部キーを使用する多くの InnoDB データベースがあるため、サーバー構成に関連する問題ではないと思います。

何か案は?

4

2 に答える 2

1

StockOut_Supplierテーブルでは、列idSupplieridTransactionTypeはsを受け入れないように設定されていますNULLが、外部キー宣言によってNULL、主キーの削除時に値をに設定するように指示しています。

それらをRESTRICTまたはCASCADE代わりに設定することをお勧めします。

于 2013-01-04T14:10:30.373 に答える
0

idSupplier に NOT NULL を設定しているため、ON DELETE SET NULL が問題ですが、次のようなスクリプトを実行してみてください。

CREATE TABLE StockOut_Supplier (
  idSupplier INT NOT NULL,
  CONSTRAINT FOREIGN KEY (idSupplier) REFERENCES Suppliers(idSupplier)
    ON UPDATE CASCADE
);

ALTER TABLE StockOut_Supplier
  ADD FOREIGN KEY (idSupplier) REFERENCES Suppliers(idSupplier)
    ON DELETE SET NULL;
于 2013-01-04T14:23:57.680 に答える