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;

即使我只留下一个外键(例如给供应商) - 结果将保持不变。

当我尝试创建没有外键的表并ALTER TABLE稍后添加它们时,也会发生同样的事情。我注意到我可以在没有ON DELETE ON UPDATE子句的情况下添加它们,但不能与它们一起添加。

编辑:有很多 InnoDB 数据库在这台服务器上使用了很多外键,所以我猜这不是服务器配置相关的问题。

有任何想法吗?

4

2 回答 2

1

在您的StockOut_Supplier表中,列idSupplieridTransactionType设置为不接受NULLs 而是通过外键声明,您告诉它NULL在删除主键时将其值设置为。

您可能希望将它们设置为RESTRICTCASCADE

于 2013-01-04T14:10:30.373 回答
0

ON DELETE SET NULL 是问题,因为您在 idSupplier 上设置了 NOT 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 回答