mysql建立外鍵約束時報ERROR 1005 (HY000)

 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

成功!

相關文章
相關標籤/搜索