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).