【MySQL】ERROR 1005 (HY000): Can't create table' (errno: 150)

楊奇龍發表於2012-09-17
建立含有外來鍵的表的時候遇到如下錯誤 
ERROR 1005 (HY000): Can't create table 'eidsvr.oplog' (errno: 150)
test@3302 12:02:22>CREATE TABLE biz(
    -> id INTEGER NOT NULL AUTO_INCREMENT, 
    -> buid VARCHAR(255), 
    -> appkey VARCHAR(255), 
    -> createtime DATETIME, 
    -> name VARCHAR(255), 
    -> seccode TEXT(2048), 
    -> externel1 INTEGER, 
    -> externel2 VARCHAR(255), 
    -> externel3 VARCHAR(255), 
    -> PRIMARY KEY (id)
    -> ) ENGINE=InnoDB  ROW_FORMAT=COMPRESSED  KEY_BLOCK_SIZE=8 DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)
test@3302 12:03:13>CREATE TABLE oplog (
    -> id INTEGER NOT NULL AUTO_INCREMENT, 
    -> eid VARCHAR(128), 
    -> optime DATETIME, 
    -> kp VARCHAR(128), 
    -> optype INTEGER, 
    -> appkey VARCHAR(255), 
    -> buid VARCHAR(255), 
    -> description VARCHAR(255), 
    -> externel1 INTEGER, 
    -> externel2 VARCHAR(255), 
    -> externel3 VARCHAR(255), 
    -> PRIMARY KEY (id), 
    -> FOREIGN KEY(appkey) REFERENCES biz(appkey)
    -> ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED  KEY_BLOCK_SIZE=8 DEFAULT CHARSET=utf8;
ERROR 1005 (HY000): Can't create table 'eidsvr.oplog' (errno: 150)
以下情況會導致上述問題
1、外來鍵欄位與要做外來鍵校驗的欄位型別不匹配
2、MySQL支援外來鍵約束,並提供與其它DB相同的功能,但表型別必須為 InnoDB,非InnoDB 儲存引擎會導致報錯。
3、建外來鍵的表的那個列沒有index。

針對本例,在父表上的appkey 上新增索引 解決該問題! 
eidsvr@3302 12:10:09>alter table biz add index idx_b_appkey(appkey);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

eidsvr@3302 12:14:06>CREATE TABLE oplog (
    -> id INTEGER NOT NULL AUTO_INCREMENT, 
    -> eid VARCHAR(128), 
    -> optime DATETIME, 
    -> kp VARCHAR(128), 
    -> optype INTEGER, 
    -> appkey VARCHAR(255), 
    -> buid VARCHAR(255), 
    -> description VARCHAR(255), 
    -> externel1 INTEGER, 
    -> externel2 VARCHAR(255), 
    -> externel3 VARCHAR(255), 
    -> PRIMARY KEY (id), 
    -> FOREIGN KEY(appkey) REFERENCES biz(appkey)
    -> ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED  KEY_BLOCK_SIZE=8 DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.00 sec)

MySQL官方提供的問題原因:
Cannot find an index in the referenced table where the referenced columns appear as the first columns, or column types in the table and the referenced table do not match for constraint.
不能在“被reference的表”即父表裡找到包含“被reference欄位”的索引,或者是兩個關聯欄位型別不匹配!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-743759/,如需轉載,請註明出處,否則將追究法律責任。

相關文章