#sql #oracle #oracle-apex
#sql #Oracle #oracle-apex
Вопрос:
Позвольте мне извиниться, если теги неверны, я попытался прочитать требования и едва понял, поскольку у меня нет опыта в этой области, но я изо всех сил старался выбрать правильные теги. В принципе, я новичок в языке SQL, я пытался не менее 5 часов решать все свои ошибки из oracle apex, но одна проблема была действительно неразрешимой, я не понимаю код ошибки. Выглядит как простая ошибка, которую более опытные программисты быстро определили бы, поэтому вот код.
Введение: это модель данных в системе отслеживания контактов моей страны, это не так много, поскольку это мой первый предмет, связанный с любым программированием. Приведенный ниже код представляет собой полный файл с 12 таблицами, просто нужно знать, в чем ошибка, из-за которой он не может быть запущен. обратная связь picture1 после запуска (строка 1-15)
обратная связь picture2 после запуска (строка 16-24)
DROP TABLE INDIVIDUAL;
DROP TABLE DAILYMONITORING;
DROP TABLE CATEGORY;
DROP TABLE DEPENDANT;
DROP TABLE VISITRECORD;
DROP TABLE LOCATION;
DROP TABLE TRAVELRECORD;
DROP TABLE COUNTRY;
DROP TABLE FAMILYMEMBER;
DROP TABLE FAMILYRECORD;
DROP TABLE OFFICER;
DROP TABLE HEALTHOFFICE;
--Student A--
CREATE TABLE FAMILYMEMBER (
famMobileNo CHAR(12) PRIMARY KEY,
familyName CHAR(100) NOT NULL
);
--Student A (Intersection Entity)--
CREATE TABLE FAMILYRECORD (
famMobileNo CHAR(12),
mysjID CHAR(20),
constraint familyrecord_PK PRIMARY KEY (famMobileNo, mysjID),
constraint familyrecord_familymember_FK FOREIGN KEY (famMobileNo) REFERENCES Familymember (famMobileNo),
constraint familyrecord_familymember_FK FOREIGN KEY (mysjID) REFERENCES Individual(mysjID)
);
--Student A--
CREATE TABLE OFFICER (
officerID CHAR(7) PRIMARY KEY,
officerName CHAR(100) NOT NULL,
healthOfficeID CHAR(7) NOT NULL,
constraint officer_healthoffice_FK FOREIGN KEY (healthOfficeID) REFERENCES Healthoffice (healthOfficeID)
);
--Student A--
CREATE TABLE HEALTHOFFICE (
healthOfficeID CHAR(7) PRIMARY KEY,
healthOfficeAddress CHAR(100) NOT NULL,
telephoneNo CHAR(12) NOT NULL
);
--Student A (Intersection Entity)--
CREATE TABLE TRAVELRECORD(
countryID CHAR(6),
mysjID CHAR(20),
duration INTEGER CHECK(duration>0),
constraint travelrecord_PK PRIMARY KEY (countryID,mysjID),
constraint travelrecord_country_FK FOREIGN KEY(countryID) REFERENCES Country(countryID),
constraint travelrecord_individual_FK FOREIGN KEY(mysjID) REFERENCES Individual(mysjID)
);
--Student A--
CREATE TABLE COUNTRY(
countryID CHAR(6) PRIMARY KEY,
countryName CHAR(50) NOT NULL
);
--Student B--
CREATE TABLE INDIVIDUAL(
mysjID CHAR(20) PRIMARY KEY,
passportIC CHAR(20) NOT NULL,
name VARCHAR(35) NOT NULL,
ethnicity VARCHAR(20),
birthDate Date NOT NULL,
mobileNo CHAR(12),
housingAddress CHAR(100),
dateTimeArrival Date,
wristbandID CHAR(7),
yearsOfLiving INTEGER,
IDV_type CHAR(20) NOT NULL CHECK(IDV_type IN ('TRAVELLER','NONTRAVELLER')),
officerID CHAR(7),
categoryNo INTEGER NOT NULL,
constraint individual_officer_FK FOREIGN KEY(officerID) REFERENCES Officer(officerID),
constraint individual_category_FK FOREIGN KEY(categoryNo) REFERENCES Category(categoryNo)
);
--Student B--
CREATE TABLE DAILYMONITORING(
dailyMonitoringID CHAR(5) PRIMARY KEY,
dateOfMonitoring Date NOT NULL,
patientSymptoms VARCHAR(25) NOT NULL,
dayOfMonitoring INTEGER NOT NULL,
mysjID CHAR(20) NOT NULL,
constraint dailymonitoring_individual_FK FOREIGN KEY(mysjID) REFERENCES Individual(mysjID)
);
--Student B--
CREATE TABLE CATEGORY(
categoryNo INTEGER PRIMARY KEY,
dateOfArrivalInMalaysia Date,
FlightNoOrPublicTransportNo CHAR(8),
dateOfSymptomsOnset Date,
relationshipWithCase VARCHAR(20),
dateOfExposure Date,
CTY_type CHAR(3) NOT NULL CHECK(CTY_type IN ('PUI','CCI'))
);
--Student B--
CREATE TABLE VISITRECORD(
QRcode CHAR(20),
mysjID CHAR(20),
dateTimeScanQR Date NOT NULL,
constraint visitrecord_PK PRIMARY KEY(QRcode,mysjID),
constraint visitrecord_location_FK FOREIGN KEY(QRcode) REFERENCES Location(QRcode),
constraint visitrecord_individual_FK FOREIGN KEY(mysjID) REFERENCES Individual(mysjID)
);
--Student B--
CREATE TABLE LOCATION(
QRcode CHAR(20) PRIMARY KEY,
locationAddress VARCHAR(100) NOT NULL,
description VARCHAR(30)
);
--Student B--
CREATE TABLE DEPENDANT(
passportICdependant CHAR(20) PRIMARY KEY,
dependantName CHAR(100) NOT NULL,
dependantType CHAR(10) NOT NULL CHECK (dependantType IN ('Child','OKU')),
mysjID CHAR(20),
constraint dependant_individual_FK FOREIGN KEY(mysjID) REFERENCES Individual(mysjID)
);
Ответ №1:
Ваше FAMILYRECORD
определение таблицы ссылается на вызываемую таблицу Individual
, которая не существует.
Кстати, Oracle использует VARCHAR2
(символ переменной длины) для строк. CHAR
это строковый тип фиксированной длины, предоставляемый для переносимости и обычно не являющийся хорошим выбором для общих значений символов.
Комментарии:
1. хорошо, указано на тип данных, большое вам спасибо
Ответ №2:
«Таблица или представление не существует» довольно ясно. Выполняется команда, которая ссылается на таблицу, которая не существует.
Для операторов «DROP TABLE» очевидно: таблица, которую вы пытаетесь удалить, не существует.
Для других операторов это связано с тем, что вы пытаетесь создать ограничение для таблицы, которая еще не существует. Для FAMILYRECORD
таблицы существует ограничение, на которое ссылается INDIVIDUAL
, но эта таблица создается только позже в сценарии. В результате возникает ORA-942.
--Student A (Intersection Entity)--
CREATE TABLE FAMILYRECORD (
famMobileNo CHAR(12),
mysjID CHAR(20),
constraint familyrecord_PK PRIMARY KEY (famMobileNo, mysjID),
constraint familyrecord_familymember_FK FOREIGN KEY (famMobileNo) REFERENCES Familymember (famMobileNo),
constraint familyrecord_familymember_FK FOREIGN KEY (mysjID) REFERENCES Individual(mysjID)
);
Самое простое решение для этого — удалить определения ограничений внешнего ключа из вашего CREATE TABLE
оператора и создать все ограничения в конце вашего скрипта с помощью ALTER TABLE ADD CONSTRAINT
оператора.
Вам очень поможет, если вы запустите свой скрипт вручную, по одному оператору за раз в мастерской sql. Это позволит вам диагностировать ошибки для выполненной инструкции. Если вы проведете диагностику после запуска скрипта, это будет слишком сложно.
Поскольку вы новичок в Oracle и Apex, вот несколько советов на будущее:
- Не используйте тип данных CHAR . Вместо этого используйте VARCHAR2
- Определите идентификаторы в верхнем регистре (имена таблиц, имена столбцов и т. Д.). Позже это избавит вас от множества головных болей.
- Используйте отдельный столбец первичного ключа типа number
GENERATED ALWAYS AS IDENTITY
. С этим намного проще работать, чем с составными первичными ключами. Если вы хотите обеспечить уникальность по столбцам, используйте уникальный индекс для обеспечения этого.
Комментарии:
1. «Вам очень поможет, если вы запустите свой скрипт вручную, по одному оператору за раз в мастерской sql. Это позволит вам диагностировать ошибки для выполненного оператора.’ > Я не знал об этом, я обязательно переключусь на этот метод.
2. Большое спасибо за дополнительные советы, теперь я понимаю, какие улучшения необходимо внести, это действительно будет полезно в моем путешествии по SQL
3. Хорошо, теперь я знаю, что это проблема с компоновкой, не знал об этом ранее. Tyvm
Ответ №3:
Речь идет о порядке, в котором вы должны создавать таблицы. Поскольку существуют ограничения внешнего ключа:
- сначала создайте мастер
- затем создайте дочерний элемент
В противном случае Oracle жалуется, что вы ссылаетесь на таблицу, которая еще не создана. Это означает, что почти весь CREATE TABLE
список должен быть изменен:
SQL> --Student A--
SQL> CREATE TABLE FAMILYMEMBER (
2 famMobileNo CHAR(12) PRIMARY KEY,
3 familyName CHAR(100) NOT NULL
4 );
Table created.
SQL>
SQL> --Student A--
SQL> CREATE TABLE HEALTHOFFICE (
2 healthOfficeID CHAR(7) PRIMARY KEY,
3 healthOfficeAddress CHAR(100) NOT NULL,
4 telephoneNo CHAR(12) NOT NULL
5 );
Table created.
SQL>
SQL> --Student A--
SQL> CREATE TABLE OFFICER (
2 officerID CHAR(7) PRIMARY KEY,
3 officerName CHAR(100) NOT NULL,
4 healthOfficeID CHAR(7) NOT NULL,
5 constraint officer_healthoffice_FK FOREIGN KEY (healthOfficeID) REFERENCES Healthoffice (healthOfficeID)
6 );
Table created.
SQL>
SQL> --Student B--
SQL> CREATE TABLE CATEGORY(
2 categoryNo INTEGER PRIMARY KEY,
3 dateOfArrivalInMalaysia Date,
4 FlightNoOrPublicTransportNo CHAR(8),
5 dateOfSymptomsOnset Date,
6 relationshipWithCase VARCHAR(20),
7 dateOfExposure Date,
8 CTY_type CHAR(3) NOT NULL CHECK(CTY_type IN ('PUI','CCI'))
9 );
Table created.
SQL>
SQL> --Student B--
SQL> CREATE TABLE INDIVIDUAL(
2 mysjID CHAR(20) PRIMARY KEY,
3 passportIC CHAR(20) NOT NULL,
4 name VARCHAR(35) NOT NULL,
5 ethnicity VARCHAR(20),
6 birthDate Date NOT NULL,
7 mobileNo CHAR(12),
8 housingAddress CHAR(100),
9 dateTimeArrival Date,
10 wristbandID CHAR(7),
11 yearsOfLiving INTEGER,
12 IDV_type CHAR(20) NOT NULL CHECK(IDV_type IN ('TRAVELLER','NONTRAVELLER')),
13 officerID CHAR(7),
14 categoryNo INTEGER NOT NULL,
15 constraint individual_officer_FK FOREIGN KEY(officerID) REFERENCES Officer(officerID),
16 constraint individual_category_FK FOREIGN KEY(categoryNo) REFERENCES Category(categoryNo)
17 );
Table created.
SQL>
SQL> --Student A (Intersection Entity)-- --> rename FK
SQL> CREATE TABLE FAMILYRECORD (
2 famMobileNo CHAR(12),
3 mysjID CHAR(20),
4 constraint familyrecord_PK PRIMARY KEY (famMobileNo, mysjID),
5 constraint familyrecord_familymember_FK FOREIGN KEY (famMobileNo) REFERENCES Familymember (famMobileNo),
6 constraint familyrecord_individual_FK FOREIGN KEY (mysjID) REFERENCES Individual(mysjID)
7 );
Table created.
SQL>
SQL> --Student A--
SQL> CREATE TABLE COUNTRY(
2 countryID CHAR(6) PRIMARY KEY,
3 countryName CHAR(50) NOT NULL
4 );
Table created.
SQL>
SQL> --Student A (Intersection Entity)--
SQL> CREATE TABLE TRAVELRECORD(
2 countryID CHAR(6),
3 mysjID CHAR(20),
4 duration INTEGER CHECK(duration>0),
5 constraint travelrecord_PK PRIMARY KEY (countryID,mysjID),
6 constraint travelrecord_country_FK FOREIGN KEY(countryID) REFERENCES Country(countryID),
7 constraint travelrecord_individual_FK FOREIGN KEY(mysjID) REFERENCES Individual(mysjID)
8 );
Table created.
SQL>
SQL> --Student B--
SQL> CREATE TABLE DAILYMONITORING(
2 dailyMonitoringID CHAR(5) PRIMARY KEY,
3 dateOfMonitoring Date NOT NULL,
4 patientSymptoms VARCHAR(25) NOT NULL,
5 dayOfMonitoring INTEGER NOT NULL,
6 mysjID CHAR(20) NOT NULL,
7 constraint dailymonitoring_individual_FK FOREIGN KEY(mysjID) REFERENCES Individual(mysjID)
8 );
Table created.
SQL>
SQL> --Student B--
SQL> CREATE TABLE LOCATION(
2 QRcode CHAR(20) PRIMARY KEY,
3 locationAddress VARCHAR(100) NOT NULL,
4 description VARCHAR(30)
5 );
Table created.
SQL>
SQL> --Student B--
SQL> CREATE TABLE VISITRECORD(
2 QRcode CHAR(20),
3 mysjID CHAR(20),
4 dateTimeScanQR Date NOT NULL,
5 constraint visitrecord_PK PRIMARY KEY(QRcode,mysjID),
6 constraint visitrecord_location_FK FOREIGN KEY(QRcode) REFERENCES Location(QRcode),
7 constraint visitrecord_individual_FK FOREIGN KEY(mysjID) REFERENCES Individual(mysjID)
8 );
Table created.
SQL>
SQL> --Student B--
SQL> CREATE TABLE DEPENDANT(
2 passportICdependant CHAR(20) PRIMARY KEY,
3 dependantName CHAR(100) NOT NULL,
4 dependantType CHAR(10) NOT NULL CHECK (dependantType IN ('Child','OKU')),
5 mysjID CHAR(20),
6 constraint dependant_individual_FK FOREIGN KEY(mysjID) REFERENCES Individual(mysjID)
7 );
Table created.
SQL>
Кроме того, вы можете создавать таблицы в любом порядке, который вы хотите, но без внешних ключей. Затем создайте внешние ключи, используя ALTER TABLE
инструкцию. Это зависит от вас.
Кроме того, необходимо переименовать один из внешних ключей; у вас не может быть двух из них с одинаковым именем ( familyrecord_familymember_FK
) .
CHAR(100)
почти наверняка неверно; вероятно, должен быть VARCHAR2
тип данных для большинства строковых столбцов в этих таблицах.
Комментарии:
1. Хорошо, я действительно ценю вашу помощь, я, наконец, понял ошибку из-за расположения, спасибо за дополнительные советы. Это много значит для новичков, таких как я
2. Пожалуйста. Я надеюсь, вам понравятся оба Oracle и Apex!