Sql 错误:没有与引用表的给定键匹配的唯一约束
由于某种原因,我的代码中出现了一个错误*。我对PostgreSQL非常陌生,只是SQL。是什么导致了这个错误 *没有唯一的约束匹配引用表“tech”的给定键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
在表
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;