首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当添加NULL约束时,LOCK=NONE会失败,出现“无法静默转换空值”错误,尽管没有空值。

问当添加NULL约束时,LOCK=NONE会失败,出现“无法静默转换空值”错误,尽管没有空值。
EN

Database Administration用户
提问于 2014-06-16 12:32:52
回答 1查看 4.2K关注 0票数 4

我试图使用MySQL的在线DDL特性向InnoDB表添加NOT NULL约束,而不阻止对表的写入。根据手册,这应该是可能的--总结MySQL 5.6's在线DDL功能的链接表在Make列NOT NULL行的允许并发DML列中有'YES‘。

然而,当我真正尝试的时候,它在我尝试过的所有情况下都失败了。即使我试图添加NOT NULL约束的列不包含任何NULL值,我也会得到以下奇怪的错误:

错误1846 (0A000):不支持LOCK=NONE。原因:不能按照此SQL_MODE中的要求默默地转换空值。试试LOCK=SHARED。

下面是MySQL外壳中的一个非常简单的测试用例:

代码语言:javascript
复制
mysql> CREATE TABLE `Test` (
    ->   `id` int(10) auto_increment PRIMARY KEY,
    ->   `stuff` varchar(100) DEFAULT NULL
    -> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.08 sec)
mysql> ALTER TABLE Test MODIFY stuff varchar(100) NOT NULL, LOCK=none;
ERROR 1846 (0A000): LOCK=NONE is not supported. Reason: cannot silently convert NULL values, as required in this SQL_MODE. Try LOCK=SHARED.

我如何(如果有的话)绕过这个问题,在允许并发DML的同时添加一个NOT NULL约束?

如果是相关的话:我的确切MySQL版本是5.6.16,而我的SQL_MODE是NO_ENGINE_SUBSTITUTION。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2014-11-26 00:07:36

这似乎是在MySQL 5.6.10中引入的一个bug,后来得到了修复(尽管我无法在http://bugs.mysql.com上找到bug报告)。问题中描述的行为并不发生在最新版本的MySQL中。

在MySQL 5.7.5-M15中观察到的行为:

代码语言:javascript
复制
mysql> CREATE TABLE `Test` (
    ->   `id` int(10) auto_increment PRIMARY KEY,
    ->   `stuff` varchar(100) DEFAULT NULL
    -> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.38 sec)

mysql> ALTER TABLE Test MODIFY stuff varchar(100) NOT NULL, LOCK=none;
Query OK, 0 rows affected (0.97 sec)
Records: 0  Duplicates: 0  Warnings: 0
票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/68315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档