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参数,可以更改表结构(表字段、索引),而无需复制表,因此可以节省磁盘空间和时间。


数据运维技术 » MySQL Error number: MY-012157; Symbol: ER_IB_MSG_332; SQLSTATE: HY000 报错 故障修复 远程处理