restricciones restar insertar fecha columna calculada agregar postgresql database-design triggers default-value postgresql-9.2

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 .