table 中不存在密钥,但它是 | PostgreSQL, timescaledb

Key is not present in table, but it is | Postgresql, timescaledb

我有下一个数据库。

CREATE TABLE DataLines(
    id        BIGSERIAL NOT NULL,
    TimeStamp TIMESTAMP NOT NULL,
    
    PRIMARY KEY (id, timestamp)
);

CREATE TABLE SpnValues(
    id         BIGSERIAL NOT NULL PRIMARY KEY                              ,
    valueInt   BIGINT    NOT NULL                                          ,
    dataLineId BIGSERIAL                                                   ,
    timestamp  TIMESTAMP NOT NULL                                          ,
    
    FOREIGN KEY (datalineid, timestamp) REFERENCES DataLines(id, timestamp)
);

当我尝试在其中插入一些值时,我收到错误消息“table 中不存在密钥”,但它确实存在,我已经查过了!我什至尝试直接从 datalines 写入 spnvalues,但收到同样的错误。

有什么问题?

UPD

我从 DataLines.

创建了 hypertable
SELECT create_hypertable('datalines', 'timestamp');

Foreign key constraints referencing a hypertable are not supported.

我试过独特的约束,但也没有成功。

所以,我找到解决这个问题的唯一方法是删除 SpnValues 中的 foregein 键

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

旧版本

datalineid 也必须是 NOT NULL,与 timestamp 相同。

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

    FOREIGN KEY (datalineid, timestamp) REFERENCES DataLines(id, timestamp)
);

原因可能是您提供的 TimeStamp 值不够精确。内部时间戳精确到微秒,即您的值文字必须如下所示 '2021-12-15 14:19:20.248137'。因此 运行 下面的查询提取所有 TimeStamp 数字并重试。

select id, to_char(TimeStamp, 'yyyy-mm-dd hh24:mi:ss.us')
from datalines;

示例输出:

id to_char
1 2021-12-15 14:19:20.248137
2 2021-12-14 14:19:20.248137

我试过了

insert into SpnValues (valueInt, dataLineId, TimeStamp) 
  values (10, 2, '2021-12-14 14:19:20.248137');

并且有效。毫秒精度(3 位数)它失败了。