初学者SQL:引用非主键

时间:2017-05-23 12:48:50

标签: sql oracle

我已创建此表。

CREATE TABLE TourEvent(
TourID VARCHAR(7),
TourName references WineryTours(TourName),
Month CHAR (3),
Day NUMERIC (2),
Year NUMERIC (4),
Fee NUMERIC (4),
PRIMARY KEY(TourID)
);

我正在尝试创建另一个表,将几乎所有的表引用到另一个表中但是我遇到了麻烦

ORA-02270:此列列表没有匹配的唯一键或主键

这是我到目前为止的代码

CREATE TABLE Bookings(
BookingID VARCHAR(7) PRIMARY KEY,
ClientID references Clients(ClientID),
TourID references TourEvent(TourID),
Tour references TourEvent(TourName),
EventMonth references TourEvent(MONTH),
EventDay references TourEvent(DAY),
EventYear references TourEvent(Year),
Fee references TourEvent(Fee),
DateBooked Date
);

阅读外键,它说我只能引用主键,我正在尝试不同的东西,但不知道如何继续。

谢谢

3 个答案:

答案 0 :(得分:1)

实际上,您无法将外键添加到非主键字段。

如果你想要外键到TouEvent表中的TourID字段,你需要为它创建一个主键。

答案 1 :(得分:0)

你的方法错了。您只想包含TourId作为参考。像这样:

CREATE TABLE Bookings (
    BookingID VARCHAR2(7) PRIMARY KEY,
    ClientID ?? references Clients(ClientID),
    TourID VARCHAR2(7) references TourEvent(TourID),
    DateBooked Date
);

您可以在查询数据库时使用JOIN来获取导览的详细信息。

注意:

  • 您需要在定义列时包含类型,甚至是外部引用。
  • Oracle(仍然)推荐VARCHAR2()超过VARCHAR()
  • 定义外键引用时,列和键的类型必须匹配。

答案 2 :(得分:0)

TourEvent表格中,您可以使用一个DAY列和MONTH列替换YEARDATETourName列需要一种数据类型:

CREATE TABLE TourEvent(
  TourID    VARCHAR2(7)  CONSTRAINT TourEvent__TourID__PK   PRIMARY KEY,
  TourName  VARCHAR2(50) CONSTRAINT TourEvent__TourName__FK REFERENCES WineryTours(TourName),
  eventdate DATE,
  Fee       NUMERIC (4)
);

为您的约束命名并使用VARCHAR2 rather than VARCHAR也是一种好习惯。

然后,您只需要引用主键:

CREATE TABLE Bookings(
  BookingID  VARCHAR2(7) CONSTRAINT Bookings__ID__PK PRIMARY KEY,
  ClientID   VARCHAR2(7) CONSTRAINT Bookings__ClientID__FK references Clients(ClientID),
  TourID     VARCHAR2(7) CONSTRAINT Bookings__TourID__FK references TourEvent(TourID),
  DateBooked Date
);

如果您想查找旅游的详细信息,可以使用加入:

SELECT b.*,
       t.tourname,
       t.eventdate,
       t.fee
FROM   Bookings b
       INNER JOIN
       TourEvent t
       ON ( b.tourid = t.tourid )