Database 没有唯一的约束匹配给定的关键点也最终使关系不存在
我有两个应该创建的表。第一个创建得很好,但是当第二个创建起来时,它告诉我没有唯一的约束匹配表“building”的给定键 我对postgresql很陌生,所以我真的不知道。我在这里搜索了一下,发现了一些类似的东西,但是那些只是说指定的字段不够唯一,这我还不太理解(这也是错误所说的)。我是不是没有特别提到建筑物的名称,还是怎么了 在创建使用room表的下一行的表时,它告诉我room关系不存在,但我假设它处理了这个错误 任何帮助都将不胜感激 第一个(“住房”)不可能创建。自己试试看 要解决这个问题,你需要改变“住房”的结构,或者改变“房间”的结构。这里有一种方法可以修复“住房”的结构。(不要做这些修复——要做的不仅仅是让外键工作。) 其他列可能也应该声明为Database 没有唯一的约束匹配给定的关键点也最终使关系不存在,database,postgresql,create-table,Database,Postgresql,Create Table,我有两个应该创建的表。第一个创建得很好,但是当第二个创建起来时,它告诉我没有唯一的约束匹配表“building”的给定键 我对postgresql很陌生,所以我真的不知道。我在这里搜索了一下,发现了一些类似的东西,但是那些只是说指定的字段不够唯一,这我还不太理解(这也是错误所说的)。我是不是没有特别提到建筑物的名称,还是怎么了 在创建使用room表的下一行的表时,它告诉我room关系不存在,但我假设它处理了这个错误 任何帮助都将不胜感激 第一个(“住房”)不可能创建。自己试试看 要解决这个问题,
非null
下面是修复“房间”结构的一种方法
现在,我们来谈谈其他一些问题。表的原始结构包含了对外键引用的尝试
CREATE TABLE room (
num integer PRIMARY KEY,
capacity integer,
address varchar(15) not null,
zipcode integer not null,
foreign key (address, zipcode) references housing (address, zipcode)
);
这意味着您相信“名称”表示“住房”。但在原始表格中,“名称”并不表示“住房”;“address”和“zipcode”两列标识“housing”。现在,我不知道“名字”在这里是什么意思,我也不想猜。它可能是一个房屋的名字(不管是什么意思),可能是居住者的名字,也可能是其他类型的名字。无论如何,给“名字”起个更好的名字
根据美国邮政局的数据,在美国,地址最长可达64个字符。有些城市名称超过15个字符。邮政编码不是整数。邮政编码可以有前导零;整数不能为空。使用char(5)
表示五位数的邮政编码。还可以考虑在检查约束中使用正则表达式,以确保在zip代码中只能使用数字0~9。
使用
num
作为“房间”的主键可能是个坏主意。如果它指的是实际的房间号,那么您的数据库中只能有一个房间100。如果它不是指一个实际的房间号码,那么你就无法合理地识别一个房间。这张桌子需要更多的工作。您需要对容量进行检查约束,以确保其大于零。这不是真正的PostresSql,而是关系理论。如果不是唯一的,就不能引用。想想看。如果有多个值,您将如何任意选择一个值?你不能。名称列不是唯一的。故事结束了。
CREATE TABLE housing (
name varchar(15) not null unique,
address varchar(15),
city varchar(15),
state varchar(15),
zipcode integer,
PRIMARY KEY(address, zipcode)
);
CREATE TABLE room (
num integer PRIMARY KEY,
capacity integer,
address varchar(15) not null,
zipcode integer not null,
foreign key (address, zipcode) references housing (address, zipcode)
);
name varchar(15) REFERENCES housing(name)