ERROR: No unique constraint matching given keys for referenced table

ERROR: No unique constraint matching given keys for referenced table

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

*没有匹配给定键的唯一约束被引用 table "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;

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

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

实际上更好的想法是通过 PRIMARY KEY 设置引用,所以在你的情况下 username in table Tech.

如果您想保留所讨论的结构,只需在 Tech 列中添加 UNIQUE(tech_id)

你觉得这段代码怎么样?

BEGIN;

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

    UNIQUE(person_id),
    UNIQUE(email_adr)
);

CREATE TABLE Phone (
    person_id   INT,
    phone_nr    INT PRIMARY KEY,
);


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

    FOREIGN KEY(tech_id) REFERENCES Person(person_id),
    UNIQUE(username),
    UNIQUE(tech_id)
);

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

    FOREIGN KEY(tech_id) REFERENCES Person(person_id),
    UNIQUE(customer_id)
);

CREATE TABLE Task (
    task_id     SERIAL PRIMARY KEY,
    payment     MONEY,
    tech        varchar(80) REFERENCES Tech(username)       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;