Como forçar o MySQL a tomar 0 como um valor válido de incremento automático

4

Para encurtar a história, eu tenho um arquivo SQL que eu quero importar como um arquivo skel style, então isso será feito repetidamente, programaticamente. Eu posso editar o arquivo SQL como quiser, mas prefiro não tocar no próprio aplicativo.

Este aplicativo usa userid = 0 para representar o usuário anônimo. Ele também tem uma entrada relevante (em branco) no banco de dados para representar esse 'usuário'. Assim, a linha no meu skel.sql é algo como isto:

INSERT INTO '{{TABLE_PREFIX}}users' VALUES (0, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL);

O problema é que uid é um campo auto_increment , para o qual, tecnicamente, 0 é um valor inválido. Ou pelo menos, se você configurá-lo para 0, você está basicamente dizendo ao MySQL, "Por favor, insira o próximo id neste campo."

Agora, suponho que eu poderia colocar uma consulta INSERT e depois UPDATE em meu arquivo SQL, mas existe uma maneira de dizer ao MySQL em geral que sim, eu realmente quero inserir 0 neste campo?

    
por Matthew Scharley 17.07.2009 / 12:32

2 respostas

8

Você pode usar:

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'

Que, conforme descrito aqui , impedirá que o MySQL interpretando um ID INSERT / UPDATE de 0 como sendo o próximo ID de sequência. Esse comportamento será limitado a NULL.

É o que eu considero um comportamento muito ruim do aplicativo. Você terá que ter muito cuidado para usar de forma consistente, especialmente se você optar por implementar a replicação em uma data posterior.

    
por 17.07.2009 / 12:45
1

Verifique o seu modo de banco de dados sql com:

SELECT @@[GLOBAL|SESSION].sql_mode;

Se estiver vazio ou não definido, use:

 SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'

TENHA CUIDADO! Se você usar GLOBAL , não é uma alteração imediata, será necessário reiniciar sua conexão para aplicar a configuração.

Portanto, se você estiver restaurando dados de um banco de dados para outro, por exemplo, e não tiver certeza se essa configuração é aplicada, use SESSION para uma alteração imediata (redefine quando conexão de fechamento). Quando terminar, insira o valor 0 e ele não será alterado, mesmo se o sql_mode for alterado.

Para redefinir este modo (e outros) use

 SET [GLOBAL|SESSION] sql_mode=''

Zero valores de incremento automático não são recomendados para uso, porque ele não é definido como padrão em bancos de dados mysql.

Para mais informações, consulte tópico da página do mysql dev neste

    
por 09.09.2010 / 13:10