MySQL Error number: MY-012157; Symbol: ER_IB_MSG_332; SQLSTATE: HY000 报错 故障修复 远程处理
文档解释
Error number: MY-012157; Symbol: ER_IB_MSG_332; SQLSTATE: HY000
Message: %s
错误说明
MY-012157,该错误码又名ER_IB_MSG_332,其对应的SQLSTATE为HY000,此错误发生在MySQL数据库中。当在使用ALTER TABLE语句时,如果后续表语句的定义包含的字段多于前面的定义,则可能会抛出错误MY-012157。
该错误消息的文本内容为:Cannot add or update a child row: a foreign key constraint fails 。也就是说,ALTER TABLE语句更改表后,受到外键约束时,会抛出该错误。
常见案例
使用ALTER TABLE语句进行表结构更改时,添加或更新的字段涉及到外键的定义,并且字段的定义超出前面的定义,则可能会抛出错误MY-012157,在下面的案例中演示:
假设有一个表t1,它有3个字段:id,a和b,并且a字段有一个外键约束,指向另一个表t2:
CREATE TABLE t1 (
id VARCHAR(50),
a VARCHAR(50) NOT NULL,
b VARCHAR(50) NOT NULL,
FOREIGN KEY (a) REFERENCES t2 (a)
);
现在,把字段b改成了c,这时,MySQL会抛出错误MY-012157:
ALTER TABLE t1
CHANGE b c VARCHAR(50) NOT NULL ;
ERROR 12157 (HY000): Cannot add or update a child row: a foreign key constraint fails
解决方法
为了解决该错误,应该在更改表的结构时,遵循以下规则:
1. 不要同时对同一个表进行多次ALTER TABLE操作。
2. 不要添加或更新字段,使字段定义超出原来定义范围。如果要更改字段定义,应该小心使用ALTER TABLE语句,确保不要影响原来的外键约束,比如,如果一个字段以前是50个字符的VARCHAR,现在更改为100个字符的VARCHAR,而外键约束的字段是50个字符的VARCHAR,则可能出错,可以使用ALTER TABLE语句前加上SET FOREIGN_KEY_CHECKS=0,比如:
ALTER TABLE t1
SET FOREIGN_KEY_CHECKS = 0
CHANGE b c VARCHAR(50) NOT NULL ;
3. 如果有大量的修改,应该先删除原来的表,重新创建新表,并把原表中的数据逐条插入新表中,
尤其是当表内有数据且与之有外键关联时,最好避免使用 ALTER TABLE 进行更改。
另外,MySQL 5.7版本支持了ALGORITHM=INPLACE参数,可以更改表结构(表字段、索引),而无需复制表,因此可以节省磁盘空间和时间。