数据类型不同于引用 table
Data Type different from reference table
我正在创建一个示例 IRTC 数据库,其中包括 tables ticket
和 train_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 TRAIN
的 primary key
。
您可以根据您的业务逻辑更改 primary key
和 foreign 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
抱歉,如果我发布了错误的问题。我是平台新手。
我正在创建一个示例 IRTC 数据库,其中包括 tables ticket
和 train_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 TRAIN
的 primary key
。
您可以根据您的业务逻辑更改 primary key
和 foreign 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 抱歉,如果我发布了错误的问题。我是平台新手。