2012-01-09 22 views
6

È un loro campo int in mysql dove i numeri negativi non sono consentiti? o più nello specifico se un numero negativo è inserito nel campo, inserirà uno zero. Lo chiedo perché abbiamo un sistema di punteggio e non permettiamo alle persone di avere punteggi negativi. Quindi se il loro punteggio raggiunge lo zero inferiore, verrà invece inserito uno zero. Sto provando a farlo senza dover interrogare il punteggio dell'utente per verificare se scenderà al di sotto dello zero.mysql previene i numeri negativi

risposta

12

In aggiunta alla modifica DDL (INT UNSIGNED) che altri hanno raccomandato, cambierei anche la logica dell'applicazione. dire:

che sto cercando di fare questo senza dover interrogare punteggio dell'utente per controllare se cadrà a zero soffietto

non controlla in modo esplicito in un separato. query:

UPDATE your_table 
    SET score = GREATEST(score + ?, 0) -- This '?' is the adjustment to the score 
WHERE user_id = ? 

Ora l'applicazione non può AGGIORNARE score per scendere sotto zero, né genererà errori o avvisi a seconda della modalità SQL.

+0

Questa è un'idea molto utile. Ho modificato alcuni campi in unsigned ma hanno attivato metodi di gestione degli errori esistenti e ho dovuto rimuoverli. Questo è utile per evitare una query/connessione inutile da verificare. – M1ke

9

Sì. È possibile creare un campo int e contrassegnarlo come UNSIGNED.

enter image description here

Da MySQL 5.0 Reference Manual:

INT[(M)] [UNSIGNED] [ZEROFILL] 

A normal-size integer. The signed range is -2147483648 to 2147483647. 
The unsigned range is 0 to 4294967295. 
+0

Ma provare a inserire -ve integer alla colonna int unsigned non genera l'errore – Raaghu

4

MySQL ha una qualificazione UNSIGNED per tipi interi.

valori negativi saranno fissati a zero, ma genererà un avvertimento:

mysql> create table test (id int(5) unsigned not null); 
Query OK, 0 rows affected (0.05 sec) 

mysql> insert into test values (-1), (5), (10); 
Query OK, 3 rows affected, 1 warning (0.01 sec) 
Records: 3 Duplicates: 0 Warnings: 1 

mysql> select * from test; 
+----+ 
| id | 
+----+ 
| 0 | 
| 5 | 
| 10 | 
+----+ 
3 rows in set (0.01 sec) 
+0

L'avviso causerà un errore mysql se si verifica un errore? – user962449

+0

@ user962449 Non so, non ho mai attivato l'errore di cattura in questo modo. Perché non lo provi? – Alnitak

1

Se si esegue in modalità SQL rigorosa questo getterebbe un errore e un inserimento/aggiornamento fallirebbe.

Io di solito creo una funzione definita dall'utente per questo genere di cose. (In questo caso un banale "if (expr1, expr2, expr3)" farà il trucco

Problemi correlati