Estou tentando usar o recurso DDL online do MySQL para adicionar uma NOT NULL
restrição a uma tabela InnoDB sem bloquear as gravações na tabela. De acordo com o manual, isso deve ser possível - a tabela vinculada que resume os recursos DDL on-line do MySQL 5.6 tem um 'SIM' na coluna Allows concurrent DML da linha Make column NOT NULL .
No entanto, quando eu realmente tento isso, ele falha em absolutamente todas as circunstâncias que eu tentei. Mesmo que a coluna à qual estou tentando adicionar a NOT NULL
restrição não contenha nenhum NULL
valor, recebo o seguinte erro estranho:
ERRO 1846 (0A000): LOCK=NONE não é suportado. Motivo: não é possível converter silenciosamente valores NULL, conforme exigido neste SQL_MODE. Tente LOCK=SHARED.
Aqui está um caso de teste ultra-simples no shell do 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.
Como (se for o caso) posso contornar isso e adicionar uma NOT NULL
restrição enquanto permito DML simultâneo?
Caso seja relevante: minha versão exata do MySQL é 5.6.16 e meu SQL_MODE é NO_ENGINE_SUBSTITUTION
.
Este parece ser um bug que foi introduzido no MySQL 5.6.10 e desde então foi corrigido (embora não haja nenhum relatório de bug em http://bugs.mysql.com que eu possa encontrar). O comportamento descrito na pergunta não ocorre na versão mais recente do MySQL.
Comportamento observado no MySQL 5.7.5-m15: