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.

La clave no está presente en la tabla, pero está | Postgresql, timescaledb

Tengo la siguiente base de datos.

“`{sql}
CREATE TABLE DataLines(
id BIGSERIAL NOT NULL,
TimeStamp TIMESTAMP NOT NULL,

<pre><code>PRIMARY KEY (id, timestamp)
</code></pre>

);

CREATE TABLE SpnValues(
id BIGSERIAL NOT NULL PRIMARY KEY,
valueInt BIGINT NOT NULL,
dataLineId BIGSERIAL,
timestamp TIMESTAMP NOT NULL,

<pre><code>FOREIGN KEY (datalineid, timestamp) REFERENCES DataLines(id, timestamp)
</code></pre>

);

<pre><code><br />Cuando intento insertar algún valor en ella, recibo un error "La clave no está presente en la tabla", ¡pero sí lo está, lo he comprobado! Incluso he intentado escribir directamente en **spnvalues** desde **datalines**, pero recibo el mismo error.

¿Cuál es el problema?

**UPD**

Creé una hiper tabla a partir de **DataLines**.

“`{sql}
SELECT create_hypertable(‘datalines’, ‘timestamp’);

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema probablemente esté relacionado con el hecho de que has creado una hipertabla desde “DataLines” usando TimescaleDB, pero no has actualizado la restricción de clave externa en la tabla “SpnValues” para tener en cuenta la hipertabla. Cuando se utiliza TimescaleDB, la clave de partición (en este caso, la marca de tiempo) ya no es un simple valor de columna, sino que forma parte de la estructura interna de la hipertabla. Por lo tanto, debes utilizar la función de TimescaleDB “time_bucket_gapfill()” para insertar datos en la hipertabla en lugar de insertarlos directamente en la tabla base.

    Para solucionar la restricción de clave externa en la tabla “SpnValues”, debes actualizarla para hacer referencia a la hipertabla en lugar de la tabla base.

    ALTER TABLE SpnValues
    DROP CONSTRAINT SpnValues_datalineid_timestamp_foreign;
    
    ALTER TABLE SpnValues
    ADD CONSTRAINT SpnValues_datalineid_timestamp_foreign
    FOREIGN KEY (dataLineId, timestamp)
    REFERENCES datalines(time_bucket_gapfill('1 minute', timestamp));
    

    Esto debería permitirte insertar datos con éxito en la hipertabla sin encontrar el error “Clave no está presente en la tabla”.

Comments are closed.