Mysql
 sql >> Database >  >> RDS >> Mysql

Come aggiungere un vincolo intero positivo a una colonna intera in MySQL?

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