Mysql

創建FK時Mysql錯誤

  • September 23, 2012

這是兩個表的結構

category table
CREATE TABLE category (
`catID` bigint(20) NOT NULL AUTO_INCREMENT,
`title` varchar(60) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`catID`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;

和第二張桌子projects

CREATE TABLE `projects` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`catID` int(11) NOT NULL,
`industryID` int(11) NOT NULL,
`dsID` int(11) NOT NULL,
`countryID` int(11) NOT NULL,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `catID` (`catID`),
KEY `industryID` (`industryID`),
KEY `dsID` (`dsID`),
KEY `countryID` (`countryID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

現在將 FK 添加到表中是查詢,但我不斷收到錯誤

Can't create table .... (errno: 150)
ALTER TABLE `projects`  ADD CONSTRAINT FK_catID FOREIGN KEY projects (catID)  REFERENCES category (catID)

在兩個表之間創建外鍵時,參與關係的列的數據類型必須具有相同的數據類型。在您上面發布的範例中,它失敗了,因為Categories表定義CatIDBIGINTwheras 在Projects表中您已將其定義為INT. 將表中CatID的數據類型更改為應該可以解決您的問題。Projects``BIGINT

我希望這可以幫助你。

外鍵約束的數據類型/大小/簽名必須相同。

`category`.`catID` bigint(20)
`projects`.`catID` int(11)

兩者都使用 bigint 或兩者都使用 int。

此外,即使它有效,此語句也可能不會完全按照您的意圖進行:

ALTER TABLE `projects` ADD CONSTRAINT FK_catID FOREIGN KEY projects (catID) REFERENCES category (catID)
-- this position is an optional index name, not a table name ^^^^^

您可能打算這樣做,而不是:

ALTER TABLE `projects` ADD CONSTRAINT FK_catID FOREIGN KEY (catID) REFERENCES category (catID)

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

ALTER TABLE tbl_name
ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]
[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]

引用自:https://dba.stackexchange.com/questions/24583