es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Agregar una restricción not null a postgres si el valor es verdadero en otra tabla.

Me gustaría saber si es posible crear una tabla con una restricción not null en una columna que depende del valor de otra columna en otra tabla.
(En postgres)

Ejemplo:

CREATE TABLE IF NOT EXISTS Ref (
    id SERIAL PRIMARY KEY,
    required BOOLEAN DEFAULT FALSE
);

CREATE TABLE IF NOT EXISTS Value (
    id SERIAL PRIMARY KEY,
    refId INTEGER REFERENCES Ref(id) NOT NULL,
    value TEXT,
);

Entonces, me gustaría agregar una restricción NOT NULL a value si required es TRUE.

Intenté usar algunas comprobaciones, pero parece que solo comprueba las columnas dentro de la misma tabla :(.

Gracias de antemano.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible crear una tabla con una restricción de no nulo en una columna dependiendo del valor de otra columna en otra tabla en PostgreSQL. Una posible solución es usar una función de activación que revise el valor de la columna “required” en la tabla “Ref” y establezca la restricción de no nulo en la columna “value” en la tabla “Value” correspondientemente. Aquí hay un ejemplo de cómo hacerlo:

    -- crea la tabla "Ref"
    CREATE TABLE IF NOT EXISTS Ref (
        id SERIAL PRIMARY KEY,
        required BOOLEAN DEFAULT FALSE
    );
    
    -- crear la tabla "Value" con una restricción temporal no nulo en la columna "value"
    CREATE TABLE IF NOT EXISTS Value (
        id SERIAL PRIMARY KEY,
        refId INTEGER REFERENCES Ref(id) NOT NULL,
        value TEXT NOT NULL
    );
    
    -- crear la función activador
    CREATE OR REPLACE FUNCTION check_required() RETURNS TRIGGER AS $$
    BEGIN
        IF (SELECT required FROM Ref WHERE id = NEW.refId) THEN
            ALTER TABLE Value ALTER COLUMN value SET NOT NULL;
        ELSE
            ALTER TABLE Value ALTER COLUMN value DROP NOT NULL;
        END IF;
        RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    
    -- crear el activador que llama a la función después de cada inserción o actualización en la tabla "Value"
    CREATE TRIGGER check_required_trigger
    AFTER INSERT OR UPDATE ON Value
    FOR EACH ROW EXECUTE FUNCTION check_required();
    

    En este ejemplo, la función de activación “check_required” consulta la tabla “Ref” para verificar el valor de la columna “required” para el valor “refId” correspondiente en la tabla “Value”. Si es verdadero, la función establece la restricción de no nulo en la columna “value” en la tabla “Value” usando la instrucción “ALTER TABLE”. Si no es verdadero, la función eliminan la restricción de no nulo en la columna “value”. El activador “check_required_trigger” llama a la función después de cada inserción o actualización en la tabla “Value”.

    Tenga en cuenta que la tabla “Value” se crea con una restricción temporal no nulo en la columna “value” porque la función de activación establece o elimina la restricción de no nulo dinámicamente en función del valor de “required”. Esto evita cualquier violación de restricción inicial al insertar datos en la tabla “Value”.

Comments are closed.