{"id":48,"date":"2015-03-30T07:26:07","date_gmt":"2015-03-30T07:26:07","guid":{"rendered":"http:\/\/www.josejavierfm.es\/blog\/?p=48"},"modified":"2015-06-19T07:26:59","modified_gmt":"2015-06-19T07:26:59","slug":"check-en-mysql","status":"publish","type":"post","link":"https:\/\/www.josejavierfm.es\/blog\/2015\/03\/30\/check-en-mysql\/","title":{"rendered":"Check en mysql"},"content":{"rendered":"<p>Los check en mysql no funcionan<\/p>\n<p>si creamos una tabla y le a\u00f1adimos un check<\/p>\n<p>CREATE TABLE cliente (<br \/>\nSD integer CHECK (SD &gt; 0),<br \/>\nnombre varchar (30),<br \/>\napellido varchar(30)<br \/>\n);<\/p>\n<p>E intentamos introducir un dato que no cumpla el check no nos da ningun error:<\/p>\n<pre>INSERT INTO cliente values ('-2','abc','zz');\r\nINSERT INTO cliente values (-3,'abc','zz');\r\n<\/pre>\n<p>Vemos que en la tabla tenemos los valores.<\/p>\n<p><a href=\"http:\/\/www.josejavierfm.es\/blog\/wp-content\/uploads\/2015\/06\/mysql_2.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-49\" src=\"http:\/\/www.josejavierfm.es\/blog\/wp-content\/uploads\/2015\/06\/mysql_2.png\" alt=\"mysql_2\" width=\"260\" height=\"116\" \/><\/a><\/p>\n<p>Para solventar el problema tenemos que recurrir a un trigger<\/p>\n<p>CREATE TRIGGER check_trigger<br \/>\nBEFORE INSERT<br \/>\nON cliente<br \/>\nFOR EACH ROW<br \/>\nBEGIN<br \/>\nIF NEW.SD&lt;0 THEN<br \/>\nCALL `Error: El valor de SD tiene que ser mayor que 0`;<br \/>\nEND IF;<br \/>\nEND<\/p>\n<p>Ahora si intentamos introducir un valor que no cumple los requisitos<\/p>\n<p>INSERT INTO cliente values (-4,&#8217;tiene que fallar&#8217;,&#8217;por el trigger&#8217;);<\/p>\n<p>Obtenemos un error, tal y como esperabamos:<\/p>\n<p>[Err] 1305 &#8211; PROCEDURE clases.Error: El valor de SD tiene que ser mayor que 0 does not exist<\/p>\n<p>Hemos resuelto el problema, no es del todo cierto, pues el trigger era solo para insert, si actualizamos un valor no salta:<\/p>\n<p>update cliente set nombre=&#8217;cambiado&#8217; where sd=-2<\/p>\n<p>En mysql no se puede crear un trigger para insert or update como en oracle, por lo que hay que duplicar el trabajo.<\/p>\n<p>CREATE TRIGGER check_trigger_update<br \/>\nBEFORE update<br \/>\nON cliente<br \/>\nFOR EACH ROW<br \/>\nBEGIN<br \/>\nIF NEW.SD&lt;0 THEN<br \/>\nCALL `Error: El valor de SD tiene que ser mayor que 0`;<br \/>\nEND IF;<br \/>\nEND<\/p>\n<p>Ahora si ejecutamos la sentencia:<\/p>\n<p>update cliente set sd=-4 where sd=-2<\/p>\n<p>Nos devuelve un error, como era de esperar.<\/p>\n\n<div class=\"twitter-share\"><a href=\"https:\/\/twitter.com\/intent\/tweet?via=josejavierfm\" class=\"twitter-share-button\">Twittear<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Los check en mysql no funcionan si creamos una tabla y le a\u00f1adimos un check CREATE TABLE cliente ( SD integer CHECK (SD &gt; 0), nombre varchar (30), apellido varchar(30) ); E intentamos introducir un dato que no cumpla el check no nos da ningun error: INSERT INTO cliente values (&#8216;-2&#8242;,&#8217;abc&#8217;,&#8217;zz&#8217;); INSERT INTO cliente values [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[7],"tags":[],"_links":{"self":[{"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/posts\/48"}],"collection":[{"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/comments?post=48"}],"version-history":[{"count":1,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/posts\/48\/revisions"}],"predecessor-version":[{"id":50,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/posts\/48\/revisions\/50"}],"wp:attachment":[{"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/media?parent=48"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/categories?post=48"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/tags?post=48"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}