restar - restricciones en postgresql
PostgreSQL: establece un valor de celda predeterminado de acuerdo con otro valor de celda (1)
Si tengo una columna, diga la column a
de cualquier valor dado y quiero que otra column b
tenga un default value
acuerdo con el valor de la column a
En otras palabras:
si la column a = ''peter''
entonces la column b default value = ''doctor''
.
Esto no es posible con un simple valor DEFAULT
, ya que el manual establece claramente :
El valor es cualquier expresión sin variable (no se permiten subconsultas ni referencias cruzadas a otras columnas en la tabla actual).
Podrías usar un trigger lugar:
CREATE OR REPLACE FUNCTION trg_foo_b_default()
RETURNS trigger AS
$func$
BEGIN
-- For just a few constant options, CASE does the job:
NEW.b :=
CASE NEW.a
WHEN ''peter'' THEN ''doctor''
WHEN ''weirdo'' THEN ''shrink''
WHEN ''django'' THEN ''undertaker''
ELSE NULL
END;
/* -- For more, or dynamic options, you could use a lookup table:
SELECT INTO NEW.b t.b
FROM def_tbl t
WHERE t.a = NEW.a;
*/
RETURN NEW;
END
$func$ LANGUAGE plpgsql;
CREATE TRIGGER b_default
BEFORE INSERT ON foo
FOR EACH ROW
WHEN (NEW.b IS NULL AND NEW.a IS NOT NULL)
EXECUTE PROCEDURE trg_foo_b_default();
Para hacer esto más efectivo, uso una cláusula WHEN
(disponible desde Postgres 9.0) con la definición de activador. De esta manera, la función de disparo solo se ejecuta, cuando es realmente útil. Supongo que aquí, podemos dejar que b IS NULL
deslice si a IS NULL
.
Funciona de manera similar, pero sutilmente diferente a un valor DEFAULT
.
Con un valor predeterminado, puede insertar explícitamente NULL
para anular el valor predeterminado. Eso no es posible aquí, NULL
en b
se reemplaza con el valor derivado de a
.