Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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
Database 没有唯一的约束匹配给定的关键点也最终使关系不存在_Database_Postgresql_Create Table - Fatal编程技术网

Database 没有唯一的约束匹配给定的关键点也最终使关系不存在

Database 没有唯一的约束匹配给定的关键点也最终使关系不存在,database,postgresql,create-table,Database,Postgresql,Create Table,我有两个应该创建的表。第一个创建得很好,但是当第二个创建起来时,它告诉我没有唯一的约束匹配表“building”的给定键 我对postgresql很陌生,所以我真的不知道。我在这里搜索了一下,发现了一些类似的东西,但是那些只是说指定的字段不够唯一,这我还不太理解(这也是错误所说的)。我是不是没有特别提到建筑物的名称,还是怎么了 在创建使用room表的下一行的表时,它告诉我room关系不存在,但我假设它处理了这个错误 任何帮助都将不胜感激 第一个(“住房”)不可能创建。自己试试看 要解决这个问题,

我有两个应该创建的表。第一个创建得很好,但是当第二个创建起来时,它告诉我没有唯一的约束匹配表“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)