sql - 如何使用 Postgres 添加指向 2 个表之一的外键?

标签 sql postgresql

我想添加一个外键,用于检查记录或个人记录表之一中是否存在事件的 record_id。可以用 Postgres 来做吗?

CREATE TABLE record
(
    id BIGSERIAL PRIMARY KEY
);

CREATE TABLE personal_record
(
    id BIGSERIAL PRIMARY KEY
);

CREATE TABLE activity
(
    id        BIGSERIAL PRIMARY KEY,
    record_id BIGINT NOT NULL,
    CONSTRAINT record_fk FOREIGN KEY (record_id) REFERENCES record (id)
);

最佳答案

如上所述,这是不可能的。一种可能性是生成列和可为空的引用:

CREATE TABLE activity (
    id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    private_record_id BIGINT,
    private_personal_record_id BIGINT,
    record_id BIGINT GENERATED ALWAYS AS (COLAESCE(private_record_id, private_personal_record_id)),
    CHECK( (private_record_id IS NOT NULL AND private_personal_record_id IS NULL) OR
           (private_record_id IS NULL AND private_personal_record_id IS NOT NULL)
         ),           
    CONSTRAINT fk_activity_record_id FOREIGN KEY (private_record_id) REFERENCES record(id),
    CONSTRAINT fk_activity_record_id FOREIGN KEY (private_personal_record_id) REFERENCES personal_record(id),
);

您可能还想研究继承。

关于sql - 如何使用 Postgres 添加指向 2 个表之一的外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64196259/

相关文章:

mysql - Group By 子句不显示相同的行值?

mysql - 获取数据子集到 qplot

mysql - Postgres : crosstab and remove duplicates on query

sql - Informix - 删除临时表(如果存在)

mysql - (phpmyadmin)(Mysql数据库)如何限制特定键值的插入次数?

php - 用于搜索邮政编码的文件或数据库?

python - 如何在用户注册时生成一个魔数(Magic Number)并将其填充到数据库中?

algorithm - 如何找到 PostgreSQL 存储删除算法?

sql - 如何在 SQL (postgres) 中按年份找到与最大资源相关的项目 ID?

sql - Postgres jsonb列从字符串与通配符匹配的数组中选择