mysql 删除主外关联数据OR表

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 (这一点前述测试中没有发现报错)

你可能感兴趣的:(mysql,测试,File,table,null,引擎)