MySQL Error number: MY-012084; Symbol: ER_IB_MSG_259; SQLSTATE: HY000

文档解释

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 值。

你可能感兴趣的