首页 文章

初学者SQL:引用非主键

提问于
浏览
1

我创建了这个表 .

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

    你有错误的方法 . 您只想包含 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() .

    • 定义外键引用时,列和键的类型必须匹配 .

  • 0

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

    如果要将外键用于TouEvent表中的TourID字段,则需要为其创建主键 .

  • 1

    TourEvent 表中,可以用单个 DATE 列替换 DAYMONTHYEAR 列, TourName 列需要数据类型:

    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 )
    

相关问题