2010-03-25 12 views
27

Ok, in this question Ho imparato come impedire l'inserimento di un valore NULL. Ma, sfortunatamente, una stringa vuota viene inserita comunque. Oltre a prevenire questo dal lato PHP, mi piacerebbe usare qualcosa come un vincolo del database per evitare questo. Naturalmente è necessario un controllo sul lato dell'applicazione, ma mi piacerebbe che fosse su entrambi i lati.Sto cercando un vincolo per impedire l'inserimento di una stringa vuota in MySQL

Mi viene insegnato che qualsiasi applicazione stia parlando al database, non dovrebbe essere in grado di inserire dati fondamentalmente errati. Quindi ...

CREATE TABLE IF NOT EXISTS tblFoo (
    foo_id int(11) NOT NULL AUTO_INCREMENT, 
    foo_test varchar(50) NOT NULL, 
    PRIMARY KEY (foo_id) 
); 

sarebbe comunque mi permetterà di fare questo inserto:

INSERT INTO tblFoo (foo_test) VALUES (''); 

che vorrei per prevenire.

+3

Vedo la necessità di evitare stringhe vuote e anche a me è stato insegnato a impedire l'inserimento di dati errati a livello di database. Ma l'esperienza mi ha insegnato che è necessario fare un attento giudizio costi/benefici basato sulla complessità del vincolo. Alcuni vincoli sono semplici da esprimere a livello di applicazione, ma possono diventare molto ingombranti a livello di database. Peggio ancora, tendono a bloccarti completamente in un fornitore di database se esagerare. Solo il mio $ 0,02. –

risposta

15

Normalmente si dovrebbe farlo con vincolo CHECK:

foo_test VARCHAR(50) NOT NULL CHECK (foo_test <> '') 

Purtroppo MySQL ha un supporto limitato per vincoli. Da MySQL Reference Manual:

La clausola CONTROLLO viene analizzato, ma ignorato da tutti i motori di archiviazione.

Ecco perché è necessario utilizzare triggers come soluzione, come hanno sottolineato le persone.

In futuro, è possibile che si desideri take a look at PostgreSQL, che è considerato per avere un migliore supporto per l'integrità dei dati (tra other things) da many people.

+1

Quindi ... ciò che in oracle è gestito da un vincolo NOT NULL, richiede un vincolo NOT NULL e due trigger (prima dell'aggiornamento e prima dell'introduzione) in MySQL. E qualche hacking se mi piace che venga generato un errore, secondo questa domanda: http: // StackOverflow.it/questions/24. Il consiglio di guardare PostgreSQL potrebbe essere il miglior consiglio qui! Grazie! – Whakkee

+2

PostgreSQL ha anche i suoi limiti. Tuttavia, ci sono molte persone che non sono mai uscite al di fuori del loro mondo PHP/MySQL (per primo appreso), per il quale consiglio davvero di prendere una boccata d'aria almeno una volta per scoprire cosa stanno perdendo. Quindi torna se vuoi ancora ;-) – jholster

+0

Supporto per CHECK CONSTRAINT disponibile in MariaDB da [10.2.1] (https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/) ([ MDEV-7563] (https://jira.mariadb.org/browse/MDEV-7563)). –

7

È possibile utilizzare i trigger per impedire l'inserimento di una stringa vuota.

E 'non è veloce, non molto conciso e non bella, ma ...

Esempio:

  1. Crea il tuo tavolo:

    mysql> create table yar (val VARCHAR(25) not null); 
    Query OK, 0 rows affected (0.02 sec) 
    
  2. Crea la tua 'prima inserire 'trigger per controllare la stringa vuota e non consentire.

    mysql> delimiter $ 
    
    mysql> create trigger foo before insert on yar 
        -> for each row 
        -> begin 
        -> if new.val = '' then 
        -> signal sqlstate '45000'; 
        -> end if; 
        -> end;$$ 
    Query OK, 0 rows affected (0.01 sec) 
    
    mysql> delimiter ; 
    
  3. tenta di inserire nulla e stringavuota nella vostra colonna:

    mysql> insert into yar values(""); 
    ERROR 1644 (45000): Unhandled user-defined exception condition 
    
    mysql> insert into yar values(NULL); 
    ERROR 1048 (23000): Column 'val' cannot be null 
    
    mysql> insert into yar values ("abc"); 
    Query OK, 1 row affected (0.01 sec) 
    
    mysql> select * from yar; 
    +-----+ 
    | val | 
    +-----+ 
    | abc | 
    +-----+ 
    1 row in set (0.00 sec) 
    
Problemi correlati