Error number: MY-012084; Symbol: ER_IB_MSG_259; SQLSTATE: HY000
Message: %s
错误说明
MySQL 错误代码 MY-012084(ER_IB_MSG_259)报告,“分类值键指定为 NOT NULL,但充当分类值列的列存在 NULL 值”。也就是说,用户指定的分类值键要求没有空值,但是某些分类值列包含空值。MySQL 的 SQLSTATE 状态码为 HY000 。
常见案例
MY-012084(ER_IB_MSG_259)错误可能在用户为兴趣表定义分类值键时出现。如果分类值键的列(比如 id 列)可能包含空值,则 InnoDB 将引发此错误。错误也可能在更新或添加分类值列时发生,如果更新空值到不允许空值的分类值列。
下面是一个示例,演示了 MY-012084(ER_IB_MSG_259)错误:
mysql> CREATE TABLE test (id int NOT NULL,val int, KEY(id));
Query OK, 0 rows affected (0.34 sec)
mysql> INSERT INTO test (id,val) VALUES (NULL,10);
Query OK, 1 row affected (0.10 sec)
mysql> ALTER TABLE test ADD UNIQUE KEY (id);
ERROR HY000 (ER_IB_MSG_259)’Id-2′ for key ‘id’ was NULL;
解决方法
解决 MY-012084(ER_IB_MSG_259)错误的办法取决于用户操作,用做分类值键时是想要什么。如果用户在创建键时,想要来自分类值列的所有值都是唯一的,则应该在创建期间将列定义为 NOT NULL。以上面的示例为例,此问题可以使用以下语句进行解决:
mysql> CREATE TABLE test (id int NOT NULL,val int, KEY(id));
Query OK, 0 rows affected (0.34 sec)
mysql> ALTER TABLE test MODIFY id int NOT NULL;
Query OK, 0 rows affected (0.10 sec)
mysql> ALTER TABLE test ADD UNIQUE KEY (id);
Query OK, 0 rows affected (0.15 sec)
但是,如果列中可以有 NULL 值,则应该将 NOT NULL 约束从列中去除,然后再添加键:
mysql> CREATE TABLE test (id int,val int, KEY(id));
Query OK, 0 rows affected (0.34 sec)
mysql> ALTER TABLE test DROP NOT NULL;
Query OK, 0 rows affected (0.10 sec)
mysql> ALTER TABLE test ADD UNIQUE KEY (id);
Query OK, 0 rows affected (0.15 sec)
此外,在创建分类值列时,应该先检查列中是否存在 NULL 值,如果有,则应从该列中删除掉空的记录。因为记录的处理可能会耗费时间,因此 InnoDB 复制的错误消息会提示出:分类值列存在 NULL 值。