外键错误

时间:2016-04-02 15:27:56

标签: sql postgresql foreign-keys primary-key

当我尝试创建此表时

CREATE SEQUENCE ticket_id_seq;
create table Ticket (
  ticket_id INTEGER DEFAULT nextval('ticket_id_seq') NOT NULL,
  event_id INTEGER NOT NULL,
  performance_id INTEGER NOT NULL,
 seat_area VARCHAR(30),
 order_id INTEGER,
FOREIGN KEY (order_id) REFERENCES Order_info (order_id) ON DELETE SET NULL ON             UPDATE CASCADE,
FOREIGN KEY (performance_id) REFERENCES Performance (performance_id) ON   DELETE SET NULL ON UPDATE CASCADE,
PRIMARY KEY (ticket_id));

我收到错误:"错误:没有唯一约束匹配给定引用表的键#34;性能"

但是这对我来说没有意义,因为引用Performance的表使用了performance_id作为主键:

CREATE SEQUENCE performance_id_seq;
create table Performance (
   event_id  INTEGER NOT NULL,
   performance_id INTEGER DEFAULT nextval('performance_id_seq') NOT NULL,
   event_status VARCHAR(10),
   performance_date VARCHAR(45),
   performance_time VARCHAR(20),
   venue_id INTEGER,
  nbr_seats INTEGER,
  purchase_limit INTEGER,
  posting_date DATE DEFAULT CURRENT_DATE,
  sale_start_date DATE DEFAULT CURRENT_DATE,
  minimum_ticket_price VARCHAR(30),
  maximum_ticket_price VARCHAR(30),
FOREIGN KEY (event_id) REFERENCES Event (event_id) ON DELETE SET NULL ON UPDATE CASCADE,
FOREIGN KEY (venue_id) REFERENCES Venue (venue_id) ON DELETE SET NULL ON UPDATE CASCADE,
PRIMARY KEY (event_id, performance_id));

所以我真的不确定为什么我会收到此错误,因为performance_id是其自己的表中唯一的主键。

2 个答案:

答案 0 :(得分:1)

Performance中的主键由两列组成,即pai4(event_id, performance_id)。

我不确定你的意图是什么,但由于序列的使用,performance_id是唯一的。所以,你可以使用:

PRIMARY KEY (performance_id);

表示performance表。我还要把它作为第一列,明确event_id只是表演的一个属性。

如果使用多列来定义主键,则在使用外键引用表时需要使用所有列。

答案 1 :(得分:1)

performance_id本身并不是唯一的。它只是主键的一部分;对(event_id, performance_id)是唯一的。可以有多个行具有相同的performance_id(但不同的event_id)。