我试图使用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外壳中的一个非常简单的测试用例:
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。
发布于 2014-11-26 00:07:36
这似乎是在MySQL 5.6.10中引入的一个bug,后来得到了修复(尽管我无法在http://bugs.mysql.com上找到bug报告)。问题中描述的行为并不发生在最新版本的MySQL中。
在MySQL 5.7.5-M15中观察到的行为:
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: 0https://dba.stackexchange.com/questions/68315
复制相似问题