Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 错误:没有与引用表的给定键匹配的唯一约束_Sql_Postgresql_Foreign Keys_Database Schema_Ddl - Fatal编程技术网

Sql 错误:没有与引用表的给定键匹配的唯一约束

Sql 错误:没有与引用表的给定键匹配的唯一约束,sql,postgresql,foreign-keys,database-schema,ddl,Sql,Postgresql,Foreign Keys,Database Schema,Ddl,由于某种原因,我的代码中出现了一个错误*。我对PostgreSQL非常陌生,只是SQL。是什么导致了这个错误 *没有唯一的约束匹配引用表“tech”的给定键 在表Task中,您试图通过Tech\u id引用表Tech。为此,必须在tech中的tech\u id中添加UNIQUE约束。 现在在表Tech中,您有UNIQUE(用户名,Tech\u id),这意味着Tech\u id列中的值可以加倍 Tech ------------------------------- tech_id us

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

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


在表
Task
中,您试图通过
Tech\u id
引用表
Tech
。为此,必须在
tech
中的
tech\u id
中添加
UNIQUE约束。
现在在表
Tech
中,您有
UNIQUE(用户名,Tech\u id)
,这意味着
Tech\u id
列中的值可以加倍

Tech
-------------------------------
tech_id     username,    ....
------------------------------
1           'John'
2           'Tony'
1           'Nataly'
实际上,更好的方法是通过
主键设置引用,因此在您的情况下,
用户名
在表
Tech


如果您想保留所讨论的结构,只需在
tech
列中添加
UNIQUE(tech\u 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;

我不就是这么做的吗?“唯一(用户名,技术id)”编辑:啊,我明白了。让我check@ServO不,正如我在示例
UNIQUE(username,tech\u id)
中所写,这意味着这对列应该是唯一的。(1,'约翰'),(1,'纳塔利')在这方面是独一无二的。列
tech\u id
本身并不能解释很多问题。非常感谢!:)这应该行得通。但正如我看到的,您可以修改表结构,
Tech
Person
之间的关系是一对一的吗(这意味着每个用户名只能由一个人拥有)?如果是这样的话,我宁愿考虑在<代码> TeaTe>代码> <代码> > TeaTyID中更改“<代码>技术> /代码>列在<代码>任务<代码>到<代码> TeqIdID int引用技术(TeaTyID)不空,< /代码>。代码>主键
外键
INT
上的检查可能比在文本类型上的检查更便宜。@Gabriel的信使啊,我会尝试这样做的。但我还有最后一个问题。我已经在ORM(2)中创建了一个SQL模型,在该模型中,我指定在Task中,end_date必须大于start_date-我如何使用代码实现这一点?你是说SQL代码。在本例中,您添加了表定义
检查(结束日期>开始日期)
就像您使用
唯一(…)
@Gabriel'sMessanger该死,您真是个天使:))谢谢!
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;