因为建表时没注意致使数据库中有两张表的字符集变成了默认的 latin1,想把它转成utf8,因而使用如下命令:mysql
mysql> ALTER TABLE logistics_express_trajectory CONVERT TO CHARACTER SET utf8_general_ci;sql
ERROR 1115 (42000): Unknown character set: 'utf8_general_ci'数据库
转换失败,推想多是表中有记录不容许转换,因而想重建表并指定字符集为utf8,可是因为是生产库,表里面的记录不能直接drop,因而先把数据库表结构及记录导出:express
mysqldump -u logistics -p logistics logistics_express_trajectory > /home/logistics/logistics_express_trajectory.sqlui
而后再输入密码便可导出,接着执行drop语句:this
mysql> drop table logistics_express_trajectory;spa
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint failsorm
失败,缘由大概是由于这个表与其它表有外建约束,因而想直接用delete语句把记录清空再改字符集吧,因而:ci
mysql> delete from logistics_express_trajectory;get
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`logistics`.`logistics_order_trajectory`, CONSTRAINT `Reflogistics_express_trajectory11` FOREIGN KEY (`trajectory_id`) REFERENCES `logistics_express_trajectory` (`id`))
仍是失败,仍是由于表被其它表关联,不能删除记录。根据外键名称找到对应的表:
use INFORMATION_SCHEMA;
select table_name, column_name from KEY_COLUMN_USAGE where CONSTRAINT_NAME = 'Reflogistics_express_trajectory11';
+----------------------------+---------------+
| table_name | column_name |
+----------------------------+---------------+
| logistics_order_trajectory | trajectory_id |
+----------------------------+---------------+
表名为logistics_order_trajectory,正好也要修改改该表的字符集,因而干脆也导出该表的记录并重建:
mysqldump -u logistics -p logistics logistics_order_trajectory > /home/logistics/logistics_order_trajectory.sql
而后再输入密码便可导出,接着按顺序执行drop语句:
mysql> use logistics;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> drop table logistics_order_trajectory;
Query OK, 0 rows affected (0.04 sec)
mysql> drop table logistics_express_trajectory;
Query OK, 0 rows affected (0.04 sec)
两张表都drop成功,而后再修改导出文件中建表的字符集为utf8,再按顺序导入两张表的结构及记录便可(被依赖的表要先导噢)
source /home/logistics/logistics_express_trajectory.sql;
source /home/logistics/logistics_order_trajectory.sql;
ok,成功,再使用语句查看两张表的字符集看是否修改过来了:
mysql> SELECT table_name, table_type, engine,TABLE_COLLATION FROM information_schema.tables where table_name='logistics_express_trajectory' or table_name='logistics_order_trajectory';
+------------------------------+------------+--------+-----------------+
| table_name | table_type | engine | TABLE_COLLATION |
+------------------------------+------------+--------+-----------------+
| logistics_express_trajectory | BASE TABLE | InnoDB | utf8_general_ci |
| logistics_order_trajectory | BASE TABLE | InnoDB | utf8_general_ci |
+------------------------------+------------+--------+-----------------+
已经修改过来了,接着再补上外键约束:
ALTER TABLE logistics_express_trajectory ADD CONSTRAINT Reflogistics_member_express7
FOREIGN KEY (member_express_id)
REFERENCES logistics_member_express(id)
;
mysql> ALTER TABLE logistics_order ADD CONSTRAINT Reflogistics_member_express8
-> FOREIGN KEY (member_express_id)
-> REFERENCES logistics_member_express(id)
-> ;
ERROR 1005 (HY000): Can't create table 'logistics.#sql-d971_11498' (errno: 121)
mysql> ALTER TABLE logistics_order_trajectory ADD CONSTRAINT Reflogistics_express_trajectory11
-> FOREIGN KEY (trajectory_id)
-> REFERENCES logistics_express_trajectory(id)
-> ;
ERROR 1005 (HY000): Can't create table 'logistics.#sql-d971_11498' (errno: 121)
擦,执行失败!下次再解决吧,出去陪老婆了!
好了,回来了,继续解决吧。
由于logistics_order和logistics_order_trajectory表虽然被drop掉了,但并无把以前建表时创建的外键约束删除掉,因此怀疑是否是由于外键名称重名冲突了,因而用如下语句根据约束名查找看是否有对应的记录存在:
use INFORMATION_SCHEMA;
mysql> select table_name, column_name from KEY_COLUMN_USAGE where CONSTRAINT_NAME = 'Reflogistics_member_express8';
+-----------------+-------------------+
| table_name | column_name |
+-----------------+-------------------+
| logistics_order | member_express_id |
+-----------------+-------------------+
1 row in set (0.01 sec)
mysql> select table_name, column_name from KEY_COLUMN_USAGE where CONSTRAINT_NAME = 'Reflogistics_express_trajectory11';
+----------------------------+---------------+
| table_name | column_name |
+----------------------------+---------------+
| logistics_order_trajectory | trajectory_id |
+----------------------------+---------------+
1 row in set (0.01 sec)
果真都存在,drop掉再重建就行了
mysql> ALTER TABLE logistics_order DROP FOREIGN KEY Reflogistics_member_express8;
Query OK, 8 rows affected (0.27 sec)
Records: 8 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE logistics_order ADD CONSTRAINT Reflogistics_member_express8 FOREIGN KEY (member_express_id) REFERENCES logistics_member_express(id);
Query OK, 8 rows affected (0.27 sec)
Records: 8 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE logistics_order_trajectory DROP FOREIGN KEY Reflogistics_express_trajectory11;
Query OK, 5 rows affected (0.26 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE logistics_order_trajectory ADD CONSTRAINT Reflogistics_express_trajectory11 FOREIGN KEY (trajectory_id) REFERENCES logistics_express_trajectory(id);
Query OK, 5 rows affected (0.26 sec)
Records: 5 Duplicates: 0 Warnings: 0
OK,能够了,所有解决!