Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como adicionar uma restrição de número inteiro positivo a uma coluna de número inteiro no MySQL?


Você usaria a palavra-chave unsigned para significar que o inteiro não permite um "sinal" (ou seja - só pode ser positivo):
CREATE TABLE test (
    test_column int(11) unsigned
);

Você pode ler mais sobre os tipos de dados numéricos (assinados e não assinados) aqui .

Quanto a uma restrição real para evitar a inserção de valores negativos, o MySQL tem um CHECK cláusula que pode ser usada no CREATE TABLE declaração, no entanto, de acordo com a documentação:

Para referência, aqui está como você o usaria (e embora ele seja executado absolutamente bem, ele simplesmente não faz nada - como afirma o manual):
CREATE TABLE test (
    test_column int(11) unsigned CHECK (test_column > 0)
);

ATUALIZAÇÃO (rejeitando valores negativos completamente)
Percebi em alguns de seus comentários que você deseja que as consultas com valores negativos sejam completamente rejeitadas e não definidas como 0 (como uma transação normal em um unsigned coluna faria). Não há restrição que possa fazer isso em geral (que eu saiba, pelo menos), no entanto, se você ativar o modo estrito (com STRICT_TRANS_TABLES ), qualquer consulta que insira um valor negativo em uma coluna não assinada falhará com um erro (junto com qualquer outro erro de inserção de dados, como um enum inválido valor).

Você pode testá-lo executando o seguinte comando antes dos comandos de inserção:
SET @@SESSION.sql_mode = 'STRICT_TRANS_TABLES';

E se funcionar para você, você pode atualizar sua configuração do MySQL com sql-mode="STRICT_TRANS_TABLES" ou use SET @@GLOBAL.sql_mode = 'STRICT_TRANS_TABLES'; (Não tenho certeza se o SET O comando afetará a configuração global do mysql, portanto, pode ser melhor atualizar o arquivo de configuração real).