【问题标题】:PSQL Error there is no unique constraint matching given keys for referenced tablePSQL 错误没有唯一约束匹配给定键的引用表
【发布时间】:2015-12-05 01:40:50
【问题描述】:

我有一个棒球数据库。我收到错误 Error there is no unique constraint matching given keys for referenced table pitcher。

这是架构

CREATE TABLE Teams(
  Name varchar(30) NOT NULL Primary Key,
  Record varchar(10)
);

CREATE TABLE Player(
  Name varchar(30) NOT NULL,
  Num int NOT NULL,
  TeamName varchar(22) references Teams(Name),
  PRIMARY KEY(Name, Num, TeamName),
  Constraint NumCheck Check (Num < 100 and Num > -1)
);

CREATE TABLE Pitcher(
  PHanded varchar(10),
  PName varchar(30),
  PTeamName varchar(30),
  PNum int,
  PRIMARY KEY(PName, PTeamName, PNum),
  foreign key (PName, PTeamName, PNum) references Player(Name, TeamName, Num)
);



CREATE TABLE PosPlayer(
  PPHanded varchar(10),
  Position varchar(2),
  PPName varchar(30),
  PPNum int,
  BTeamName varchar(30),
  PRIMARY KEY(PPName, PPNum, BTeamName),
  foreign key (PPName, PPNum, BTeamName) references Player(Name, Num, TeamName)
);

CREATE TABLE Games(
  Id int Primary Key,
  SchedDate DATE,
  PlayedDate DATE,
  HomeName varchar(30),
  VisitName varchar(30),
  Winner varchar(30)
);


CREATE TABLE Pitches
(
  PID int,
  Outcome varchar(10),
  Bcount int,
  Scount int,
  Runners int,
  Type varchar(10),
  Speed int,
  Pitchnum int,
  PitName varchar(30) references Pitcher(PName),
  PitNum int references Pitcher(PNum),
  PitTeamName varchar(30) references Pitcher(PTeamName),
  BatName varchar(30) references PosPlayer(PPName),
  BatNum int references PosPlayer(PPNum),
  BatTeamName varchar(30) references PosPlayer(BTeamName),
  HomeTName varchar(30),
  VisitTName varchar(30),
  GId int references Games(Id),
  foreign key (PitName, PitNum, PitTeamName) references Pitcher (PName, PNum, PTeamName),
  foreign key (BatName, BatNum, BatTeamName) references PosPlayer (PPName, PPNum, BTeamName),
  Primary Key(PID, PitName, PitNum, PitTeamName, BatName, BatNum, BatTeamName, GID),
  Constraint Balls Check (Bcount > -1 and Bcount < 4),
  Constraint Scount Check (Scount > -1 and Scount < 3)
);

在我查找的其他线程中,建议添加一个唯一标识符,但在此模式中,可能具有相同的名称并属于同一个团队。我该如何解决这个问题?

【问题讨论】:

  • 我想我可以猜到,但是哪个 CREATE TABLE 给了你错误?
  • 投手表不显示,错误提示表投手没有唯一键。

标签: sql postgresql


【解决方案1】:

线条

CREATE TABLE Pitches
(
{...}
  PitName varchar(30) references Pitcher(PName),
  PitNum int references Pitcher(PNum),
  PitTeamName varchar(30) references Pitcher(PTeamName),
  BatName varchar(30) references PosPlayer(PPName),
  BatNum int references PosPlayer(PPNum),
  BatTeamName varchar(30) references PosPlayer(BTeamName),
{...}
)

几乎可以肯定是那些让你悲伤的人。您尝试在每种情况下都引用被引用表中的非唯一列,但这是行不通的。

好消息是您不需要这些references 子句,因为它们由表级FOREIGN KEY 子句处理,每个子句都引用一个由于是复合主键,其连接值是唯一的列。

【讨论】:

  • 哦,伙计...当然是这样的。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2016-08-13
  • 2012-08-11
  • 2021-06-24
  • 2014-12-23
  • 1970-01-01
相关资源
最近更新 更多