Dovresti utilizzare la parola chiave unsigned
per significare che l'intero non ammette un "segno" (cioè - può essere solo positivo):
CREATE TABLE test (
test_column int(11) unsigned
);
Puoi leggere ulteriori informazioni sui tipi di dati numerici (firmati e non firmati) qui .
Per quanto riguarda un vincolo effettivo per impedire l'inserimento di valori negativi, MySQL ha un CHECK
clausola che può essere utilizzata in CREATE TABLE
dichiarazione, tuttavia, secondo la documentazione:
Per riferimento, ecco come lo useresti (e anche se funzionerà perfettamente, non fa nulla, come afferma il manuale):
CREATE TABLE test (
test_column int(11) unsigned CHECK (test_column > 0)
);
AGGIORNAMENTO (rifiutando completamente i valori negativi)
Ho notato da alcuni dei tuoi commenti che desideri che le query con valori negativi vengano completamente rifiutate e non impostate su 0
(come una normale transazione in un unsigned
colonna farebbe). Non esiste alcun vincolo che possa farlo in generale (che io sappia, almeno), tuttavia, se attivi la modalità rigorosa (con STRICT_TRANS_TABLES
) qualsiasi query che inserisce un valore negativo in una colonna senza segno avrà esito negativo con un errore (insieme a qualsiasi altro errore di inserimento dati, come un enum
non valido valore).
Puoi testarlo eseguendo il seguente comando prima dei comandi di inserimento:
SET @@SESSION.sql_mode = 'STRICT_TRANS_TABLES';
E se funziona per te, puoi aggiornare la tua configurazione MySQL con sql-mode="STRICT_TRANS_TABLES"
oppure usa SET @@GLOBAL.sql_mode = 'STRICT_TRANS_TABLES';
(Non sono sicuro se il SET
il comando influenzerà la configurazione globale di mysql, quindi potrebbe essere meglio aggiornare il file di configurazione effettivo).