sql - 错误: No unique constraint matching given keys for referenced table

标签 sql postgresql foreign-keys database-schema ddl

由于某种原因,我的代码中出现错误*。我对 PostgreSQL 很陌生,对 SQL 也很陌生。是什么导致了这个错误?

*没有与引用表“tech”的给定键匹配的唯一约束。

BEGIN;

CREATE TABLE Person (
    person_id   SERIAL PRIMARY KEY,
    firstname   VARCHAR(128),
    lastname    VARCHAR(128),
    email_adr   VARCHAR(128),

    UNIQUE(person_id, email_adr)
);

CREATE TABLE Phone (
    person_id   INT REFERENCES Person(person_id),
    phone_nr    INT PRIMARY KEY,

    UNIQUE(phone_nr)
);


CREATE TABLE Tech (
    tech_id INT REFERENCES Person(person_id),
    username    VARCHAR(80) PRIMARY KEY,
    password    VARCHAR(80) NOT NULL,
    location    Varchar(128),

    UNIQUE(username, tech_id)
);

CREATE TABLE Customer (
    customer_id    INT REFERENCES Persons(person_id),
    addresse       VARCHAR(255) NOT NULL,

    UNIQUE(customer_id)
);

CREATE TABLE Task (
    task_id     SERIAL PRIMARY KEY,
    payment     MONEY,
    tech        INT REFERENCES Tech(tech_id)         NOT NULL,
    customer    INT REFERENCES Customer(customer_id) NOT NULL,
    start_date  DATE                                 NOT NULL,
    end_dato    DATE,

    UNIQUE(tech, customer, start_date, end_date)
);

COMMIT;

最佳答案

在表Task中,您尝试通过tech_id引用表Tech。为此,您必须将 UNIQUE CONSTRAINT 添加到 Tech 中的 tech_id。 现在,在表 Tech 中,您有 UNIQUE(username, tech_id),这意味着列 tech_id 中的值可以加倍,例如。

Tech
-------------------------------
tech_id     username,    ....
------------------------------
1           'John'
2           'Tony'
1           'Nataly'

实际上,更好的想法是通过PRIMARY KEY设置引用,因此在您的情况下,表Tech中的username

如果您想让结构保持所讨论的方式,您只需在 Tech 列中添加 UNIQUE(tech_id) 即可。

关于sql - 错误: No unique constraint matching given keys for referenced table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33436966/

相关文章:

sql - 在 SQL 中查找作为超集子集的所有集

javascript - 为什么我对 PostgreSQL DB 的发布请求将我的 UTC DATETIME 保存为本地时间

PostgreSQL 函数/存储过程 CURRENT_TIMESTAMP 不改变

sql - MySQL 外键约束 - 整数列

sql - PostgreSQL:列出相关行

sql - 包装存储过程

asp.net - 必须声明标量变量 "@Image"。将图像保存到数据库时出错

sql - 是否可以执行从不同列中选择两个最大值/最小值的单个 SQL 查询?

postgresql - 转储 PostgreSQL 数据库时排除函数定义

python - Django 通用外键 : accessor clash when 2 models have same related_name