ALTER TABLE `logistics_express_user` ADD CONSTRAINT `Reflogistics_express_del_com` FOREIGN KEY (`expr_del_com_id`) REFERENCES `logistics_expr_del_com` (`id`);mysql
兩線表都存在,對應的兩個字段類型都是同樣的varchar(32),但仍是報錯sql
ERROR 1005 (HY000): Can't create table 'logistics.#sql-d971_112e1' (errno: 150)express
網上說要在建外鍵的那個列上建索引,因而創建索引:windows
CREATE INDEX index_m_e_edcid ON logistics_express_user (expr_del_com_id);編碼
再執行建外鍵的操做,仍是不行,用語句查看該索引是否確實創建spa
show index from logistics_express_user;.net
+------------------------+------------+-----------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+orm
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |blog
+------------------------+------------+-----------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+索引
| logistics_express_user | 0 | PRIMARY | 1 | id | A | 3 | NULL | NULL | | BTREE | |
| logistics_express_user | 1 | index_m_e_edcid | 1 | expr_del_com_id | A | 3 | NULL | NULL | YES | BTREE | |
+------------------------+------------+-----------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+
發現索確實是建了,證實不是沒建索引的問題
網上還分析說有多是該外鍵約束的名稱「Reflogistics_express_del_com"有可能與現有的名稱衝突了,因而使用語句查詢
use INFORMATION_SCHEMA;
select * from KEY_COLUMN_USAGE where CONSTRAINT_NAME = 'Reflogistics_express_del_com';
mysql> select * from KEY_COLUMN_USAGE where CONSTRAINT_NAME = 'Reflogistics_express_del_com';
Empty set (0.00 sec)
發現沒有與現有的約束名稱衝突
與這個網友的問題是同樣的,基本上他嘗試守的我也嘗試了,也是不行,不能肯定是否是mysql自身的問題,由於在我本機電腦上執行這些語句是能夠成功的(windows8 mysql5)
http://www.iteye.com/problems/103359
在網上找到了這篇文章:http://blog.csdn.net/yageeart/article/details/7962674
提示說有多是主鍵和外鍵的字符編碼不一致,也可能存儲引擎不同
因而用如下語句查詢看是否兩個表的字符編碼不一致:
mysql> SELECT table_name, table_type, engine,TABLE_COLLATION FROM information_schema.tables where table_name='logistics_express_user' or table_name='logistics_expr_del_com';
+------------------------+------------+--------+-------------------+
| table_name | table_type | engine | TABLE_COLLATION |
+------------------------+------------+--------+-------------------+
| logistics_expr_del_com | BASE TABLE | InnoDB | latin1_swedish_ci |
| logistics_express_user | BASE TABLE | InnoDB | utf8_general_ci |
+------------------------+------------+--------+-------------------+
2 rows in set (0.00 sec)
發現兩張表的字符集果真不同,一個是latin1_swedish_ci,一個是utf8_general_ci,因而嘗試修改logistics_expr_del_com表的字符集
mysql> ALTER TABLE logistics_expr_del_com CONVERT TO CHARACTER SET utf8;
Query OK, 1 row affected (0.26 sec)
Records: 1 Duplicates: 0 Warnings: 0
修改爲功!
接着再用建立外鍵約束:
mysql> ALTER TABLE `logistics_express_user` ADD CONSTRAINT `Reflogistics_express_del_com` FOREIGN KEY (`expr_del_com_id`) REFERENCES `logistics_expr_del_com` (`id`);
Query OK, 3 rows affected (0.27 sec)
Records: 3 Duplicates: 0 Warnings: 0
成功!