#sql #oracle
#sql #Oracle
Вопрос:
Мой проект класса — я должен создать базу данных авиакомпании. По какой-то причине создается только пара таблиц CITY и AIRCRAFT_DATA. Я новичок в sql, и я пытаюсь понять, почему мои другие таблицы не создаются, и я продолжаю получать ошибки.
Я исправил имя клиента для первой таблицы, но я не знаю, с чего начать с другими ошибками, с которыми я столкнулся. Я использую Oracle SQL 11g
SQL> CREATE TABLE Customer
2 (Cust_Nbr VARCHAR(3) Constraint pk_Customer Primary Key NOT NULL,
3 Cust_Name VARCHAR2(15) NOT NULL
4 );
Error starting at line : 10 in command -
CREATE TABLE Customer
(Cust_Nbr VARCHAR(3) Constraint pk_Customer Primary Key NOT NULL,
Cust_Name VARCHAR2(15) NOT NULL
)
Error report -
ORA-00955: name is already used by an existing object
00955. 00000 - "name is already used by an existing object"
*Cause:
*Action:
SQL>
SQL> CREATE TABLE Reservation
2 (Cust_Nbr VARCHAR2(14),
3 CONSTRAINT fk_Reservation_Cust_Nbr FOREIGN KEY (Cust_Nbr)
4 REFERENCES Customer ,
5 Flight_Nbr VARCHAR2(15), CONSTRAINT fk_Reservation_Flight_Nbr FOREIGN KEY (Flight_Nbr)
6 REFERENCES Flight_Date,
7 Flight_Date DATE,
8 CONSTRAINT fk_Sched_Flight_Flight_Date FOREIGN KEY (Flight_Date)
9 REFERENCES Shed_Flight
10 );
Error starting at line : 15 in command -
CREATE TABLE Reservation
(Cust_Nbr VARCHAR2(14),
CONSTRAINT fk_Reservation_Cust_Nbr FOREIGN KEY (Cust_Nbr)
REFERENCES Customer ,
Flight_Nbr VARCHAR2(15), CONSTRAINT fk_Reservation_Flight_Nbr FOREIGN KEY (Flight_Nbr)
REFERENCES Flight_Date,
Flight_Date DATE,
CONSTRAINT fk_Sched_Flight_Flight_Date FOREIGN KEY (Flight_Date)
REFERENCES Shed_Flight
)
Error report -
ORA-02267: column type incompatible with referenced column type
02267. 00000 - "column type incompatible with referenced column type"
*Cause: The data type or collation of the referencing column was
incompatible with the data type or collation of the referenced
column.
*Action: Select a compatible data type for the referencing column.
Also, the collation of a character column in a foreign key must
match the collation of the corresponding column in the primary
key.
SQL>
SQL>
SQL> CREATE TABLE Shed_Flight
2 (Flight_Date date Constraint pk_Shed_Flight Primary Key,
3 Flight_Nbr VARCHAR2(3),
4 CONSTRAINT fk_Shed_Flight_Flight_Nbr FOREIGN KEY (Flight_Nbr)
5 REFERENCES FlightData,
6 Seats_Resvd VARCHAR2(3),
7 Seat#_Ava VARCHAR2(3),
8 TOD VARCHAR2(8),
9 TOA VARCHAR2(8),
10 Serial# VARCHAR2(10), CONSTRAINT fk_Shed_Flight FOREIGN KEY (Serial#)
11 REFERENCES AirCraft_Type
12 );
Error starting at line : 27 in command -
CREATE TABLE Shed_Flight
(Flight_Date date Constraint pk_Shed_Flight Primary Key,
Flight_Nbr VARCHAR2(3),
CONSTRAINT fk_Shed_Flight_Flight_Nbr FOREIGN KEY (Flight_Nbr)
REFERENCES FlightData,
Seats_Resvd VARCHAR2(3),
Seat#_Ava VARCHAR2(3),
TOD VARCHAR2(8),
TOA VARCHAR2(8),
Serial# VARCHAR2(10), CONSTRAINT fk_Shed_Flight FOREIGN KEY (Serial#)
REFERENCES AirCraft_Type
)
Error report -
ORA-00942: table or view does not exist
00942. 00000 - "table or view does not exist"
*Cause:
*Action:
SQL>
SQL>
SQL> CREATE TABLE FlightData
2 (Flight_Nbr VARCHAR2(3) Constraint pk_FlightData Primary Key,
3 Depart_Code VARCHAR2(30),
4 CONSTRAINT fk_Flight_Data_Depart_Code FOREIGN KEY(Depart_Code)
5 REFERENCES Airport,
6 Ariv_Code VARCHAR2(30),
7 CONSTRAINT fk_Flight_Data_Ariv_Code FOREIGN KEY(Ariv_Code)
8 REFERENCES Airport
9 );
Error starting at line : 41 in command -
CREATE TABLE FlightData
(Flight_Nbr VARCHAR2(3) Constraint pk_FlightData Primary Key,
Depart_Code VARCHAR2(30),
CONSTRAINT fk_Flight_Data_Depart_Code FOREIGN KEY(Depart_Code)
REFERENCES Airport,
Ariv_Code VARCHAR2(30),
CONSTRAINT fk_Flight_Data_Ariv_Code FOREIGN KEY(Ariv_Code)
REFERENCES Airport
)
Error report -
ORA-00942: table or view does not exist
00942. 00000 - "table or view does not exist"
*Cause:
*Action:
SQL>
SQL> CREATE TABLE Airport
2 (Airport_Code VARCHAR2(7) Constraint pk_Airport Primary Key,
3 City_Code VARCHAR2(3), Constraint fk_Airport_City_Code FOREIGN KEY(City_Code)
4 REFERENCES City,
5 Airport_Name VARCHAR2(30)
6 );
Error starting at line : 51 in command -
CREATE TABLE Airport
(Airport_Code VARCHAR2(7) Constraint pk_Airport Primary Key,
City_Code VARCHAR2(3), Constraint fk_Airport_City_Code FOREIGN KEY(City_Code)
REFERENCES City,
Airport_Name VARCHAR2(30)
)
Error report -
ORA-00942: table or view does not exist
00942. 00000 - "table or view does not exist"
*Cause:
*Action:
SQL>
SQL>
SQL> CREATE TABLE AirCraft_Type
2 (Serial# VARCHAR2(8), Conrtaint pk_AirCraft_Type Primary Key,
3 Type_ VARCHAR2(6), CONSTRAINT fk_AirCraft_Type FOREIGN KEY(Type)
4 REFERENCES AirCraft_Data
5 );
Error starting at line : 59 in command -
CREATE TABLE AirCraft_Type
(Serial# VARCHAR2(8), Conrtaint pk_AirCraft_Type Primary Key,
Type_ VARCHAR2(6), CONSTRAINT fk_AirCraft_Type FOREIGN KEY(Type)
REFERENCES AirCraft_Data
)
Error report -
ORA-00904: "TYPE": invalid identifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
SQL>
SQL>
SQL> CREATE TABLE Aircraft_Data
2 (Type_ VARCHAR2(6) Constraint pk_Aircraft_Data Primary Key,
3 Description_ VARCHAR2(20),
4 Capacity_ VARCHAR2(3),
5 Range_ VARCHAR2(4)
6 );
Table AIRCRAFT_DATA created.
SQL>
SQL>
SQL> CREATE TABLE City
2 (City_Code VARCHAR2(3) Constraint pk_City Primary Key,
3 City_Name VARCHAR2(15),
4 State_ VARCHAR2(2)
5 );
Table CITY created.
Комментарии:
1. Можете ли вы отредактировать свой пост более организованным образом, отделить коды от ошибок и предоставить некоторые подробности
Ответ №1:
Таблицы создаются в обратном порядке. Вам нужно создать CITY
before AIRPORT
и AIRCRAFT_DATA
before AIRCRAFT_TYPE
before AIRPORT
и так далее; в противном случае, как база данных узнает, на что ссылаются ваши внешние ключи, если таблица, на которую вы ссылаетесь, не существует.
Вам также необходимо указать, на какой столбец ссылается внешний ключ.
Кроме этого, вы CONSTRAINT
несколько раз неправильно пишете и FLIGHT_DATE
должны быть FLIGHTDATA
for fk_Reservation_Flight_Nbr
.
Кроме того, ваша модель данных несовершенна, поскольку SHED_FLIGHT
не допускает одновременного выполнения 2 рейсов, поскольку первичный ключ находится только в DATE
поле.
CREATE TABLE City (
City_Code VARCHAR2(3) Constraint pk_City Primary Key,
City_Name VARCHAR2(15),
State_ VARCHAR2(2)
);
CREATE TABLE Aircraft_Data (
Type_ VARCHAR2(6) Constraint pk_Aircraft_Data Primary Key,
Description_ VARCHAR2(20),
Capacity_ VARCHAR2(3),
Range_ VARCHAR2(4)
);
CREATE TABLE AirCraft_Type (
Serial# VARCHAR2(8) Constraint pk_AirCraft_Type Primary Key,
Type_ VARCHAR2(6),
CONSTRAINT fk_AirCraft_Type
FOREIGN KEY(Type_) REFERENCES AirCraft_Data (Type_)
);
CREATE TABLE Airport(
Airport_Code VARCHAR2(7) Constraint pk_Airport Primary Key,
City_Code VARCHAR2(3),
Constraint fk_Airport_City_Code
FOREIGN KEY(City_Code) REFERENCES City ( City_Code ),
Airport_Name VARCHAR2(30)
);
CREATE TABLE FlightData(
Flight_Nbr VARCHAR2(3) Constraint pk_FlightData Primary Key,
Depart_Code VARCHAR2(30),
CONSTRAINT fk_Flight_Data_Depart_Code
FOREIGN KEY(Depart_Code) REFERENCES Airport(Airport_Code),
Ariv_Code VARCHAR2(30),
CONSTRAINT fk_Flight_Data_Ariv_Code
FOREIGN KEY(Ariv_Code) REFERENCES Airport(Airport_Code)
);
CREATE TABLE Shed_Flight (
Flight_Date date Constraint pk_Shed_Flight Primary Key,
Flight_Nbr VARCHAR2(3),
CONSTRAINT fk_Shed_Flight_Flight_Nbr
FOREIGN KEY (Flight_Nbr) REFERENCES FlightData (Flight_Nbr),
Seats_Resvd VARCHAR2(3),
Seat#_Ava VARCHAR2(3),
TOD VARCHAR2(8),
TOA VARCHAR2(8),
Serial# VARCHAR2(10),
CONSTRAINT fk_Shed_Flight
FOREIGN KEY (Serial#) REFERENCES AirCraft_Type (Serial#)
);
CREATE TABLE Customer(
Cust_Nbr VARCHAR(3) Constraint pk_Customer Primary Key NOT NULL,
Cust_Name VARCHAR2(15) NOT NULL
);
CREATE TABLE Reservation(
Cust_Nbr VARCHAR2(14),
Flight_Nbr VARCHAR2(15),
Flight_Date DATE,
CONSTRAINT fk_Reservation_Cust_Nbr
FOREIGN KEY (Cust_Nbr) REFERENCES Customer (Cust_Nbr),
CONSTRAINT fk_Reservation_Flight_Nbr
FOREIGN KEY (Flight_Nbr) REFERENCES FlightData ( flight_nbr ),
CONSTRAINT fk_Sched_Flight_Flight_Data
FOREIGN KEY (Flight_Date) REFERENCES Shed_Flight ( flight_date )
);
db<>скрипка здесь
Обновить
Для Shed_Flight есть ли у вас рекомендации о том, как исправить эту ошибочную часть модели данных?
Имейте составное уникальное ограничение flight_nbr
и flight_date
, которое позволит выполнять рейсы из разных мест в одну и ту же дату. Это может быть составной первичный ключ, но я бы предпочел иметь один автоматически сгенерированный столбец идентификаторов в качестве первичного ключа, а затем эту пару столбцов как NOT NULL
и UNIQUE
, чтобы либо эта id
, либо эта пара могла использоваться в a FOREIGN KEY
.
CREATE TABLE Shed_Flight (
id NUMBER(10,0)
GENERATED ALWAYS AS IDENTITY
CONSTRAINT pk_Shed_Flight PRIMARY KEY,
Flight_Date DATE
NOT NULL,
Flight_Nbr VARCHAR2(3)
NOT NULL,
Seats_Resvd VARCHAR2(3),
Seat#_Ava VARCHAR2(3),
TOD VARCHAR2(8),
TOA VARCHAR2(8),
Serial# VARCHAR2(10),
CONSTRAINT u_Shed_Flight_Flight_Date_Flight_Nbr
UNIQUE (Flight_date, Flight_Nbr),
CONSTRAINT fk_Shed_Flight_Flight_Nbr
FOREIGN KEY (Flight_Nbr) REFERENCES FlightData (Flight_Nbr),
CONSTRAINT fk_Shed_Flight
FOREIGN KEY (Serial#) REFERENCES AirCraft_Type (Serial#)
);
Затем вы можете ссылаться на составной уникальный ключ в Reservation
таблице (и добавлять NOT NULL
ограничения):
CREATE TABLE Reservation(
id NUMBER(12,0)
GENERATED ALWAYS AS IDENTITY
CONSTRAINT pk_reservation PRIMARY KEY,
Cust_Nbr VARCHAR2(14)
NOT NULL,
Flight_Nbr VARCHAR2(15)
NOT NULL,
Flight_Date DATE
NOT NULL,
CONSTRAINT fk_Reservation_Cust_Nbr
FOREIGN KEY (Cust_Nbr) REFERENCES Customer (Cust_Nbr),
CONSTRAINT fk_Sched_Flight_Flight_Data
FOREIGN KEY (Flight_Nbr, Flight_Date) REFERENCES Shed_Flight ( Flight_nbr, flight_date )
);
Комментарии:
1. Для Shed_Flight есть ли у вас рекомендации о том, как исправить эту ошибочную часть модели данных? Мой профессор не был лучшим в оказании нам помощи в этом семестре, это было намного больше самообучения. @MTO
2. Все это очень помогло! Спасибо за ваше время и объяснения всего. @MTO