innodb存储引擎类型数据表 并且存在主外键关联
删除子表时提示 存在外键约束 无法删除
尝试办法
1.show create table 查看外键等表信息
根据里面显示的外键名称删除外键
alter table cps_product_bak drop FOREIGN KEY 'foreignkey5'
无效
2.set FOREIGN_KEY_CHECKS = 0; 禁用约束检查
万试万灵 删完记得再启用
set FOREIGN_KEY_CHECKS = 1; --启用约束检查
-----------------------------------------------------------------------------------------------------------
Mysql中与外键相关的错误
If MySQL reports an error number 1005 from a CREATE TABLE statement, and the error message
string refers to errno 150, this means that the table creation failed because a foreign key constraint
was not correctly formed. Similarly, if an ALTER TABLE fails and it refers to errno 150, that
means a foreign key definition would be incorrectly formed for the altered table. Starting from
MySQL 4.0.13, you can use SHOW INNODB STATUS to display a detailed explanation of the
latest InnoDB foreign key error in the server.
测试如下:
set FOREIGN_KEY_CHECKS = 0; --禁用约束检查
drop table product; --删除product_order的父表
set FOREIGN_KEY_CHECKS = 1; --启用约束检查
重新创建product,这次没有建pk
CREATE TABLE product
(
category INT NOT NULL,
id INT NOT NULL,
price DECIMAL,
index(category, id)
)
engine=INNODB;
查看show innodb status中的错误信息
------------------------
LATEST FOREIGN KEY ERROR
------------------------
080424 19:38:50 Cannot drop table `test/product`
because it is referenced by `test/product_order`
其它
1, mysqldump在dump数据时,会加入外键信息
2, 也可以用SHOW TABLE STATUS FROM db_name LIKE 'tbl_name';查看外键信息, 在comment列中
3, 注意innodb中如果设置了lower_case_table_names,对外键的影响
4, 在创建外键时,可以加入backtricks(反引号),将外键名,列名包括起来
5, 如果是在mysql3.23.50之前版本,注意如果表上有外键或者作为父表被refer,不要使用alter table , create index命令
6, Innodb要进行外键check时,需要在父或子表上加共享行级锁(shared row lock),不是事务级
7, 从mysql4.1.1开始,为了使reload dumpfile更容易进行,mysqldump生成的文件自动添加了FOREIGN_KEY_CHECKS=0选项以禁止外键约束检查
对于早期版本,可以用下面方法达到同样目的
mysql> SET FOREIGN_KEY_CHECKS = 0;
mysql> SOURCE dump_file_name
mysql> SET FOREIGN_KEY_CHECKS = 1;
8, 在alter table或load data时,可能也需要进行上述设置以临时禁止外键约束检查
9, 除非设置了FOREIGN_KEY_CHECKS = 0, Innodb禁止drop父表(被子表外键引用的表)
10, 当设置FOREIGN_KEY_CHECKS = 0后drop一个父子.
下次重新创建这个父表时,必须跟drop之前一样(正确的列/数据类型/被参照的列上必须有索引), 否则系统会报1005 refer to errno 150 (这一点前述测试中没有发现报错)