数据类型不同于引用 table

Data Type different from reference table

我正在创建一个示例 IRTC 数据库,其中包括 tables tickettrain_ticket_fare。我创建了一个 table ticket 列作为 ticket_class varchar(6)
在 table train_ticket_fare 中,我用这个引用了它 ticket_class references ticket.

我重新创建了 tables 来检查但找不到错误。

SQL> desc ticket
 Name                    Null?    Type
----------------------- -------- ----------------
 PNR_NO                  NOT NULL NUMBER(10) 
 TRANSACTIONID                    NUMBER(10)
 FROM_STATION                     VARCHAR2(20)
 TO_STATION                       VARCHAR2(20)
 DATE_OF_JOURNEY                  DATE
 TICKET_CLASS                     VARCHAR2(6) //this
 DATE_OF_BOOKING                  DATE
 TICKET_FARE                      NUMBER(8,2)
 TRAIN_NUMBER                     NUMBER(5)

SQL> create table Train_Ticket_fare
  2    (
  3      train_number        references train,
  4      ticket_class        references ticket, //this
  5      base_fare           number(7,2),
  6      reservation_charge  number(6,2),
  7      superfast_charge    number(6,2),
  8      other_charge        number(6,2),
  9      tatkal_charge       number(6,2),
 10      service_tax         number(6,2),
 11      primary key(train_number, ticket_class)
 12    );

Table created.

SQL> desc Train_Ticket_fare
 Name                    Null?    Type
 ----------------------- -------- ----------------
 TRAIN_NUMBER            NOT NULL NUMBER(5)
 TICKET_CLASS            NOT NULL NUMBER(10)  //this
 BASE_FARE                        NUMBER(7,2)
 RESERVATION_CHARGE               NUMBER(6,2)
 SUPERFAST_CHARGE                 NUMBER(6,2)
 OTHER_CHARGE                     NUMBER(6,2)
 TATKAL_CHARGE                    NUMBER(6,2)
 SERVICE_TAX                      NUMBER(6,2)

已解决!谢谢@stickybit。 table Train_ticket_fare 必须将 TICKET_CLASS 作为主键,以引用 table Ticket。我做了相反的事情并错误地引用了它。

子 table 中的 foreign key 通常会引用父 table 中的 primary key

在您的情况下,我假设 TICKET_CLASS 是 table TRAINprimary key

您可以根据您的业务逻辑更改 primary keyforeign key。以下只是基于假设的示例:

CREATE TABLE TICKET (
    PNR_NO            NUMBER(10) NOT NULL,
    TRANSACTIONID     NUMBER(10),
    FROM_STATION      VARCHAR2(20),
    TO_STATION        VARCHAR2(20),
    DATE_OF_JOURNEY   DATE,
    TICKET_CLASS      VARCHAR2(6),
    DATE_OF_BOOKING   DATE,
    TICKET_FARE       NUMBER(8, 2),
    TRAIN_NUMBER      NUMBER(5),
    CONSTRAINT TICKET_PK PRIMARY KEY ( TICKET_CLASS )
);

CREATE TABLE TRAIN_TICKET_FARE (
    TRAIN_NUMBER         NUMBER(10)
        REFERENCES TRAIN ( TRAIN_NUMBER ), 
       -- DATA TYPE MUST BE SAME AS TRAIN_NUMBER OF TABLE TRAIN
    TICKET_CLASS         VARCHAR2(6)
        REFERENCES TICKET ( TICKET_CLASS ),  
       -- ASSUMING THAT ticket_class IS PRIMARY KEY OF TABLE ticket_class 
    BASE_FARE            NUMBER(7, 2),
    RESERVATION_CHARGE   NUMBER(6, 2),
    SUPERFAST_CHARGE     NUMBER(6, 2),
    OTHER_CHARGE         NUMBER(6, 2),
    TATKAL_CHARGE        NUMBER(6, 2),
    SERVICE_TAX          NUMBER(6, 2),
    PRIMARY KEY ( TRAIN_NUMBER,
                  TICKET_CLASS )
       -- below is the another way of defining the foreign key
       --CONSTRAINT Train_Ticket_fare_FK FOREIGN KEY (ticket_class) REFERENCES ticket(TICKET_CLASS)
);

Table 的列必须用它自己的数据类型定义,并且应该使用外键约束来引用它,如示例中所示。 (不是这样的ticket_class references ticket

希望你能找到方向

有关外键的更多信息,请参阅此 link

干杯!!

也许你想要这样的东西:

create table train
( train_number        number(5) constraint train_pk primary key
);

create table ticket_class
( ticket_class        varchar2(6) constraint ticket_class_pk primary key
);

create table ticket
( pnr_no              number(10)  constraint ticket_pk primary key
, transactionid       number(10)
, from_station        varchar2(20)
, to_station          varchar2(20)
, date_of_journey     date
, ticket_class        references ticket_class
, date_of_booking     date
, ticket_fare         number(8,2)
, train_number        number(5)
);

create table train_ticket_fare
( train_number        references train
, ticket_class        references ticket_class
, base_fare           number(7,2)
, reservation_charge  number(6,2)
, superfast_charge    number(6,2)
, other_charge        number(6,2)
, tatkal_charge       number(6,2)
, service_tax         number(6,2)
, constraint train_ticket_fare primary key (train_number, ticket_class)
);

SQL> @desc train_ticket_fare
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TRAIN_NUMBER                              NOT NULL NUMBER(5)
 TICKET_CLASS                              NOT NULL VARCHAR2(6)
 BASE_FARE                                          NUMBER(7,2)
 RESERVATION_CHARGE                                 NUMBER(6,2)
 SUPERFAST_CHARGE                                   NUMBER(6,2)
 OTHER_CHARGE                                       NUMBER(6,2)
 TATKAL_CHARGE                                      NUMBER(6,2)
 SERVICE_TAX                                        NUMBER(6,2)

具有相同名称的 table 和列 (TICKET_CLASS) 并不好。它有效,但可能会导致歧义和混乱。避免这种情况的一种方法是使用复数形式命名 tables,例如火车,TICKET_CLASSES,车票。

这里的问题是引用引起的。 table Train_ticket_fare 必须将 TICKET_CLASS 作为主键,以引用 table 票证。我做了相反的事情并错误地引用了它。 这就是它显示错误数据类型的原因。 谢谢@stickybit 抱歉,如果我发布了错误的问题。我是平台新手。