¿Comportamiento anómalo?
Al definir una tabla con la siguiente sintaxis:
CREATE TABLE `test` (
`id` varchar(11) NOT NULL default '',
`mandatory` varchar(11) NOT NULL,
PRIMARY KEY (`id`)
) TYPE=InnoDB;
en la cual necesito que el campo 'mandatory' no admita valores nulos, resulta que si le efectúo las siguientes operaciones:
insert into test (id, mandatory) values ('A','A');
En el insert, MySQL no me admite que ponga NULL en el campo "mandatory" (como tiene que ser). En cambio si hago:
insert into test (id) values ('A');
primera anomalÃa: en el campo mandatory se inserta una cadena vacÃa (no un NULL). Eso parece que tiene su explicación en el hecho de que si hacemos un SHOW CREATE TABLE test; nos mostrará:
CREATE TABLE `test` (
`id` varchar(11) NOT NULL default '',
`mandatory` varchar(11) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=InnoDB;
Si os fijáis en la columna "mandatory", aunque en mi sentencia de creación no hubiera una cláusula default, parece que el gestor la presupone.
De todas maneras, todavÃa hay otra anomalÃa más preocupante. Ésta se muestra con la sentencia:
UPDATE test SET mandatory = NULL WHERE id = 'A';
El gestor se traga la sentencia con un simple warning y en el campo "mandatory" inserta, no un NULL, sino el valor de default, es decir, una cadena vacÃa.
¿Este comportamiento es normal? Estoy desarrollando en php contra MySQL y estarÃa interesado en conseguir que el gestor sea más exigente y que no considere esta operación un warning y sà un error. ¿Es eso posible? En su defecto, ¿podrÃa detectar desde php ese warning para interpretarlo adecuadamente?
CREATE TABLE `test` (
`id` varchar(11) NOT NULL default '',
`mandatory` varchar(11) NOT NULL,
PRIMARY KEY (`id`)
) TYPE=InnoDB;
en la cual necesito que el campo 'mandatory' no admita valores nulos, resulta que si le efectúo las siguientes operaciones:
insert into test (id, mandatory) values ('A','A');
En el insert, MySQL no me admite que ponga NULL en el campo "mandatory" (como tiene que ser). En cambio si hago:
insert into test (id) values ('A');
primera anomalÃa: en el campo mandatory se inserta una cadena vacÃa (no un NULL). Eso parece que tiene su explicación en el hecho de que si hacemos un SHOW CREATE TABLE test; nos mostrará:
CREATE TABLE `test` (
`id` varchar(11) NOT NULL default '',
`mandatory` varchar(11) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=InnoDB;
Si os fijáis en la columna "mandatory", aunque en mi sentencia de creación no hubiera una cláusula default, parece que el gestor la presupone.
De todas maneras, todavÃa hay otra anomalÃa más preocupante. Ésta se muestra con la sentencia:
UPDATE test SET mandatory = NULL WHERE id = 'A';
El gestor se traga la sentencia con un simple warning y en el campo "mandatory" inserta, no un NULL, sino el valor de default, es decir, una cadena vacÃa.
¿Este comportamiento es normal? Estoy desarrollando en php contra MySQL y estarÃa interesado en conseguir que el gestor sea más exigente y que no considere esta operación un warning y sà un error. ¿Es eso posible? En su defecto, ¿podrÃa detectar desde php ese warning para interpretarlo adecuadamente?
bienbenido a mySQL!
efectivamente, es asi.
mysql intentara insertar como sea el registro.
seguro que antes se consideraba un buen comportamiento que mysql intentara insertar registros como pudiese, ya que las aplicaciones eran constantemente revisadas y actualizadas, de manera que un cambio en la base de datos supondria un fallo generalizado.
de todas formas no me agrada mucho este comportamiento de mysql.
efectivamente, es asi.
mysql intentara insertar como sea el registro.
seguro que antes se consideraba un buen comportamiento que mysql intentara insertar registros como pudiese, ya que las aplicaciones eran constantemente revisadas y actualizadas, de manera que un cambio en la base de datos supondria un fallo generalizado.
de todas formas no me agrada mucho este comportamiento de mysql.
