2010-03-25 10 views
27

Ok, en this question aprendí cómo evitar la inserción de un valor NULL. Pero, lamentablemente, una cadena vacía se está insertando de todos modos. Además de prevenir esto en el lado de PHP, me gustaría utilizar algo así como una restricción de la base de datos para evitar esto. Por supuesto, es necesario un control en el lado de la aplicación, pero me gustaría que esté en ambos lados.Estoy buscando una restricción para evitar la inserción de una cadena vacía en MySQL

Me han enseñado que cualquiera que sea la aplicación que está hablando con su base de datos, no debería ser capaz de insertar datos básicamente erróneos en ella. Así que ...

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

todavía permitiría que haga este inserto:

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

¿Qué me gustaría evitar.

+3

Puedo ver su necesidad de evitar cadenas vacías y también me enseñaron a evitar que se inserten datos incorrectos en el nivel de la base de datos. Pero la experiencia me ha enseñado que necesita hacer un juicio cuidadoso de costo/beneficio basado en la complejidad de la restricción. Algunas restricciones son simples de expresar a nivel de aplicación, pero pueden volverse muy engorrosas a nivel de base de datos. Peor aún, tienden a encerrarlo completamente en un proveedor de base de datos si se excede. Solo mi $ 0.02. –

Respuesta

15

Lo normal es que hacer eso con restricción CHECK:

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

Desafortunadamente MySQL tiene soporte limitado para restricciones De MySQL Reference Manual:

La cláusula CHECK es analizada pero ignorada por todos los motores de almacenamiento.

Es por eso que tiene que usar triggers como una solución alternativa, como han señalado las personas.

En el futuro, es posible que desee take a look at PostgreSQL, que se considera que tiene un mejor soporte para la integridad de datos (entre other things) por many people.

+1

Entonces ... lo que en el oráculo es manejado por una restricción NOT NULL, necesita una restricción NOT NULL y dos disparadores (antes de la actualización y antes del inserto) en MySQL. Y algunos pirateo si me gusta que se produzca un error, de acuerdo con esta pregunta: http: // stackoverflow.com/questions/24. ¡El consejo para mirar PostgreSQL podría ser el mejor consejo aquí! ¡Gracias! – Whakkee

+2

PostgreSQL tiene sus propias limitaciones, también. Sin embargo, hay muchas personas que nunca salieron de su (primero aprendido) mundo de PHP/MySQL, para quienes realmente recomiendo respirar un aire fresco al menos una vez para descubrir lo que se están perdiendo. A continuación, vuelva atrás si aún desea ;-) – jholster

+0

Soporte para CHECK CONSTRAINT disponible en MariaDB desde [10.2.1] (https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/) ([ MDEV-7563] (https://jira.mariadb.org/browse/MDEV-7563)). –

7

Puede usar activadores para evitar la inserción de la banda en blanco.

No es rápido, no es muy concisa y no es bonito, pero ...

Ejemplo:

  1. crear la tabla:

    mysql> create table yar (val VARCHAR(25) not null); 
    Query OK, 0 rows affected (0.02 sec) 
    
  2. Crea tu 'antes inserte el disparador para verificar si hay banda en blanco y no permitirlo.

    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. intenta insertar nula y serievacía en su columna:

    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) 
    
Cuestiones relacionadas