Una restricción para evitar la inserción de una cadena vacía en MySQL

En esta pregunta 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.

Me han enseñado que cualquiera sea la aplicación que esté hablando con su base de datos, no debería poder insertar datos básicamente erróneos en ella. Asi 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 me permitiría hacer esta inserción:

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

Lo cual me gustaría prevenir.

Normalmente harías eso con la restricción CHECK:

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

Desafortunadamente, MySQL tiene soporte limitado para las limitaciones. De MySQL Manual de referencia :

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

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

En el futuro, es posible que desee echar un vistazo a PostgreSQL , que se considera que tiene un mejor soporte para la integridad de datos (entre otras cosas ) por muchas personas .

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

No es rápido, no es muy conciso y no es bonito, pero …

Ejemplo:

  1. Crea tu mesa:

     mysql> create table yar (val VARCHAR(25) not null); Query OK, 0 rows affected (0.02 sec) 
  2. Cree su activador ‘antes de insertar’ para verificar si hay una banda en blanco y no lo permite.

     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. Intente insertar null y banda en blanco 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)