Gilberto: 2017-04-05 18:46 GMT+02:00 Gilberto Castillo <gilberto.casti...@etecsa.cu>: >>> 2017-04-05 16:46 GMT+02:00 Gilberto Castillo >>> <gilberto.casti...@etecsa.cu>: >>>>> 2017-04-05 16:22 GMT+02:00 Pedro PG <pedr...@outlook.com>: >>>>>> Lo que deseo es agregar una restriccion CHECK que solo permita >>>>>> modificar >>>>>> datos de la tupla si y solo si liquidado es NULL. >>>>> >>>>> Igual estoy un poco oxidado, pero las restricciones check lo que hacen >>>>> es comprobar un juego de valores de la tupla, no miran si vienen de >>>>> update o de lo que sea. >>>>> >>>>>> 1) Cuando se inserta un registro el campo liquidado siempre sera NULL >>>>>> (esto >>>>>> es correcto). >>>>>> 2) Desde un procedimiento externo actualizare liquidado (esto tambien >>>>>> es >>>>>> correcto). >>>>>> 3) Si deseo actualizar el registro, solo debe permitirme si el campo >>>>>> liquidado es NULL (aqui mi problema). >>>>> >>>>> Probablemente puedes hacer eso con un trigger. De todas formas, salvo >>>>> que estes haciendo el control con roles y mucho cuidado, porque no >>>>> pones un 'where liquidadoull' extra en los updates? Tambien podrias >>>>> probar con un "create rule x on update to table where OLD.liquidado is >>>>> not null instead do nothing' o algo asi, pero te puede dar problemas >>>>> si quieres revertir una fila a liquidadoull. Al fin y al cabo, si >>>>> alguien puede cambiar liquidado a null probablemente pueda hacer >>>>> not-null->null->update->null. >>>> >>>> Yo Usaría UPSERT >>> >>> Iluminanos, porfa. Hacer eso con upsert seria un truco fantastico. > > insert into mytabla as a (campo1, liquidado) > values ('valor1',1),('valor2',null) > on conflict (liquidado) > do update set > liquidado = a.liquidado + EXCLUDED.liquidado > where a.liquidado IS NULL;
Te tomaste la molestia de leer un poco por encima lo que pedia? Suponiendo que asi fuera ( que yo personalmente creo que no pero siempre hay que otorgar el beneficio de la duda): 1.- Su problema es evitar updates, no inserts., lo pone en el punto 3. 2.- Y aunque no insertase siempre null, el campo de liquidado NO es unico. 3.- De hecho el punto 1 de la pregunta dice que insert SIEMPRE es null en insercion, lo que hace que NUNCA haya conflictos de insercion en liquidado. Francisco Olarte. - Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) Para cambiar tu suscripci�n: http://www.postgresql.org/mailpref/pgsql-es-ayuda