{"id":163,"date":"2013-11-08T09:21:09","date_gmt":"2013-11-08T12:21:09","guid":{"rendered":"http:\/\/monitor.infracoop.com.ar\/blog\/?p=163"},"modified":"2013-11-08T09:21:09","modified_gmt":"2013-11-08T12:21:09","slug":"anadir-columna-con-default-postgresql","status":"publish","type":"post","link":"https:\/\/www.infracoop.com.ar\/?p=163","title":{"rendered":"A\u00f1adir una columna con valores default en PostgreSQL"},"content":{"rendered":"<p>Hay operaciones en bases de datos que mantienen lockeos alg\u00fan tiempo en una tabla, y son buenas.<\/p>\n<p>Hay operaciones en bases de datos que mantienen lockeos menos tiempo, y son mejores.<\/p>\n<p>Y hay operaciones que no lockean las tablas. \u00c9sas son las impresindibles.<\/p>\n<p>Hoy vamos a ver diferencias al a\u00f1adir una columna con un valor por defecto en PostgreSQL.<\/p>\n<p>Tenemos una tabla, empresas:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\n\r\npadronafip=# \\d empresas;\r\n Table &quot;public.empresas&quot;\r\n Column\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0 Type\u00a0\u00a0\u00a0\u00a0\u00a0 | Modifiers\r\n --------------+---------------+-----------\r\n cuit\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | numeric(11,0) | not null\r\n denominacion | character(30) |\r\n Indexes:\r\n &quot;empresas_pkey&quot; PRIMARY KEY, btree (cuit)\r\n\r\n<\/pre>\n<p>Y vamos a a\u00f1adir un campo &#8217;empleador&#8217; para saber si la empresa tiene o no tiene empleados, pero queremos que si no le decimos nada, asuma que no tiene empleados (default=&#8217;false&#8217;):<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\n\r\npostgres@db-server:~$ time echo &quot;ALTER TABLE empresas ADD COLUMN\r\n empleador boolean default 'false'&quot;|psql padronafip\r\nALTER TABLE\r\n\r\nreal\u00a0\u00a0\u00a0 0m39.862s\r\nuser\u00a0\u00a0\u00a0 0m0.108s\r\nsys\u00a0\u00a0\u00a0 0m0.064s\r\n<\/pre>\n<p>Bien, 39 segundos, no estuvo mal. Veamos un poco c\u00f3mo quedaron los datos:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\n\r\npadronafip=# select * from empresas limit 10;\r\ncuit\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 denominacion\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | empleador\r\n-------------+--------------------------------+-----------\r\n20000004759 | SUCESION DE PAEZ DE LA TORRE C | f\r\n20000033481 | SUCESION DE PERROTTA CAYETANO\u00a0 | f\r\n20000035891 | MULLER CARLOS JORGE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | f\r\n20000129403 | MODUBAR INES\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | f\r\n20000156982 | ORTIZ GARCIA JUAN\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | f\r\n20000171345 | KAPLAN ALICIA DORA\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | f\r\n20000175499 | SUCESION DE SOLARI BENITO\u00a0\u00a0\u00a0\u00a0\u00a0 | f\r\n20000179672 | CANTARELLA ADELINA\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | f\r\n20000185036 | SUCESION DE EARNSHAW JUAN ALFR | f\r\n20000189406 | SUCESION DE CAUSARANO ANTONIO\u00a0 | f\r\n(10 rows)\r\n\r\n<\/pre>\n<p>Ahora, probemos otra aproximaci\u00f3n al mismo problema:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\n\r\npostgres@db-server:~$ time echo &quot;ALTER TABLE empresas ADD COLUMN\r\n empleador boolean;\r\nALTER TABLE empresas ALTER COLUMN empleador\r\nSET DEFAULT 'false'&quot;|psql padronafip\r\nALTER TABLE\r\nALTER TABLE\r\n\r\nreal\u00a0\u00a0\u00a0 0m0.197s\r\nuser\u00a0\u00a0\u00a0 0m0.028s\r\nsys\u00a0\u00a0\u00a0 0m0.008s\r\n<\/pre>\n<p>Wow, 0,197 segundos. La diferencia en esta tabla de prueba, es de 39 segundos, ahora, veamos c\u00f3mo quedaron los datos en nuestra tabla:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\n\r\npadronafip=# select * from empresas limit 10;\r\ncuit\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 denominacion\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | empleador\r\n-------------+--------------------------------+-----------\r\n20000004759 | SUCESION DE PAEZ DE LA TORRE C |\r\n20000033481 | SUCESION DE PERROTTA CAYETANO\u00a0 |\r\n20000035891 | MULLER CARLOS JORGE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n20000129403 | MODUBAR INES\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n20000156982 | ORTIZ GARCIA JUAN\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n20000171345 | KAPLAN ALICIA DORA\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n20000175499 | SUCESION DE SOLARI BENITO\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n20000179672 | CANTARELLA ADELINA\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n20000185036 | SUCESION DE EARNSHAW JUAN ALFR |\r\n20000189406 | SUCESION DE CAUSARANO ANTONIO\u00a0 |\r\n(10 rows)\r\n<\/pre>\n<p>Bien, en un sistema de producci\u00f3n con alta concurrencia y problemas de lockeos, creo que puedo vivir con esto, ya que me permiti\u00f3 realizar el cambio sin pedir una ventana de mantenimiento.<\/p>\n<p>Entonces, vemos que PostgreSQL realiza una re-escritura de la tabla cuando en la creaci\u00f3n de la tabla ponemos el default.<\/p>\n<p>Ojo, que si necesitamos a\u00f1adirlo con &#8216;not null&#8217; tendremos que ir por la primera opci\u00f3n (que incluye re-escritura y completar todos los nulls) ya que si intentamos el segundo camino, obtendremos:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\n\r\npostgres@db-server:~$ time echo &quot;ALTER TABLE empresas ADD COLUMN\r\nempleador boolean; ALTER TABLE empresas ALTER COLUMN empleador\r\nSET DEFAULT 'false'; ALTER TABLE empresas ALTER COLUMN empleador\r\nSET NOT NULL&quot;|psql padronafip\r\nALTER TABLE\r\nALTER TABLE\r\nERROR:\u00a0 column &quot;empleador&quot; contains null values\r\n\r\nreal\u00a0\u00a0\u00a0 0m1.565s\r\nuser\u00a0\u00a0\u00a0 0m0.076s\r\nsys\u00a0\u00a0\u00a0 0m0.004s\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Hay operaciones en bases de datos que mantienen lockeos alg\u00fan tiempo en una tabla, y son buenas. Hay operaciones en bases de datos que mantienen lockeos menos&hellip; <span class=\"read-more\"><a class=\"more-link\" href=\"https:\/\/www.infracoop.com.ar\/?p=163\" rel=\"bookmark\">Read more <span class=\"screen-reader-text\">&#8220;A\u00f1adir una columna con valores default en PostgreSQL&#8221;<\/span><\/a><\/span><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[32,22],"tags":[36,35,25,61],"class_list":["post-163","post","type-post","status-publish","format-standard","hentry","category-postgresql","category-tips","tag-add-column","tag-alter-table","tag-dba-tips","tag-postgresql"],"_links":{"self":[{"href":"https:\/\/www.infracoop.com.ar\/index.php?rest_route=\/wp\/v2\/posts\/163","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.infracoop.com.ar\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.infracoop.com.ar\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.infracoop.com.ar\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.infracoop.com.ar\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=163"}],"version-history":[{"count":9,"href":"https:\/\/www.infracoop.com.ar\/index.php?rest_route=\/wp\/v2\/posts\/163\/revisions"}],"predecessor-version":[{"id":172,"href":"https:\/\/www.infracoop.com.ar\/index.php?rest_route=\/wp\/v2\/posts\/163\/revisions\/172"}],"wp:attachment":[{"href":"https:\/\/www.infracoop.com.ar\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=163"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.infracoop.com.ar\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=163"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.infracoop.com.ar\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}