Как создать несколько таблиц в SQL разработчику? - PullRequest
0 голосов
/ 09 апреля 2020

Я сделал полностью нормализованный ERD и написал запросы, но он не создал таблицы. Пожалуйста, помогите мне исправить то, что я написал.

enter image description here

CREATE TABLE SERVER (
       SERVER_ID        VARCHAR2(20) NOT NULL,
       SERVER_IP        VARCHAR2(15) NOT NULL,
       SERVER_LOCATION  VARCHAR2(20) NOT NULL,
       SERVER_BRAND     VARCHAR2(15) NOT NULL,
       CONSTRAINT SERVER_PK PRIMARY KEY ( SERVER_ID )
);
CREATE TABLE APPLICATION (
       APP_ID       VARCHAR2(25) NOT NULL,
       ACCOUNT_NUM  INT NOT NULL,
       RECORD_ID    VARCHAR2(10) NOT NULL,
       VERSION_ID   VARCHAR2(10) NOT NULL,
       LAST_UPDATE  DATE NOT NULL,
       CONSTRAINT APPLICATION_PK PRIMARY KEY ( APP_ID ),
       CONSTRAINT APPLICATION_FK1 FOREIGN KEY ( ACCOUNT_NUM )
              REFERENCES ACCOUNT ( ACCOUNT_NUM ),
       CONSTRAINT APPLICATION_FK2 FOREIGN KEY ( RECORD_ID )
              REFERENCES RECORD ( RECORD_ID )
);
CREATE TABLE RECORD (
       RECORD_ID  VARCHAR2(25) NOT NULL,
       VIN_NUM    VARCHAR2(25) NOT NULL,
       SERVER_ID  VARCHAR2(25) NOT NULL,
       CONSTRAINT RECORD_PK PRIMARY KEY ( RECORD_ID ),
       CONSTRAINT RECORD_FK1 FOREIGN KEY ( VIN_NUM )
              REFERENCES VEHICLE ( VIN_NUM ),
       CONSTRAINT RECORD_FK2 FOREIGN KEY ( SERVER_ID )
              REFERENCES SERVER2 ( SERVER_ID )
);
CREATE TABLE VEHICLE (
       VIN_NUM    VARCHAR2(25) NOT NULL,
       V_MILEAGE  NUMBER
(,0) NOT NULL , V_GASUSED VARCHAR2(25) NOT NULL , V_ELECTRICALMILES NUMBER(,0) NOT NULL , DRIVER_ID VARCHAR2(25 BYTE) NOT NULL , CONSTRAINT VEHICLE_PK PRIMARY KEY (VIN_NUM), CONSTRAINT VEHICLE_FK1 FOREIGN KEY (DRIVER_ID) REFERENCES DRIVER (DRIVER_ID) );

CREATE TABLE SO_MODEL.DRIVER (
       DRIVER_ID         VARCHAR2(25) NOT NULL,
       LICENSE_NUM       VARCHAR2(25) NOT NULL,
       FIRST_NAME        VARCHAR2(25) NOT NULL,
       LAST_NAME         VARCHAR2(25 BYTE) NOT NULL,
       INSURANCE_POLICY  VARCHAR2(25) NOT NULL,
       ACCOUNT_NUM       NUMBER(*, 0) NOT NULL,
       CONSTRAINT DRIVER_PK PRIMARY KEY ( DRIVER_ID ),
       CONSTRAINT DRIVER_FK1 FOREIGN KEY ( ACCOUNT_NUM )
              REFERENCES ACCOUNT ( ACCOUNT_NUM )
);
CREATE TABLE ACCOUNT (
       ACCOUNT_NUM     NUMBER(*, 0) NOT NULL,
       DRIVER_ID       VARCHAR2(25) NOT NULL,
       DEVICE_ID       VARCHAR2(25) NOT NULL,
       DATE_CREATED    DATE NOT NULL,
       ACCOUNT_STATUS  VARCHAR2(10) NOT NULL,
       CONSTRAINT ACCOUNT_PK PRIMARY KEY ( ACCOUNT_NUM ),
       CONSTRAINT ACCOUNT_FK1 FOREIGN KEY ( DRIVER_ID )
              REFERENCES DRIVER ( DRIVER_ID )
);

1 Ответ

0 голосов
/ 09 апреля 2020

У вас есть циклические ссылки.

Вы пытаетесь создать таблицы с ограничениями внешнего ключа для других таблиц, которые еще не существуют.

Ваша вторая таблица создания -

CREATE TABLE APPLICATION (
       APP_ID       VARCHAR2(25) NOT NULL,
       ACCOUNT_NUM  INT NOT NULL,
       RECORD_ID    VARCHAR2(10) NOT NULL,
       VERSION_ID   VARCHAR2(10) NOT NULL,
       LAST_UPDATE  DATE NOT NULL,
       CONSTRAINT APPLICATION_PK PRIMARY KEY ( APP_ID ),
       CONSTRAINT APPLICATION_FK1 FOREIGN KEY ( ACCOUNT_NUM )
              REFERENCES ACCOUNT ( ACCOUNT_NUM ),
       CONSTRAINT APPLICATION_FK2 FOREIGN KEY ( RECORD_ID )
              REFERENCES RECORD ( RECORD_ID )
);

Чтобы создать эту таблицу, у вас уже должны быть созданы таблицы ACCOUNT и RECORD.

Самый простой способ обойти это - создать таблицы без ограничений внешнего ключа, затем, после того как все они существуют, затем запустить серия вызовов ALTER TABLE ADD CONSTRAINT для добавления правил FK обратно.

Что-то вроде ...

alter table application add constraint application_fk1 foreign key(account_num) references account(account_num);

Когда вы говорите, что таблицы не были созданы - у вас нет поделитесь с нами тем, как вы пытались создать их в первую очередь, или поделитесь любыми сообщениями об ошибках, с которыми вы столкнулись при попытке.

Если вы использовали для создания этого Oracle SQL Developer Data Modeler, мы сделаем это Легко генерировать DDL с FK как ALTERS в конце, чтобы избежать этой проблемы, во-первых.

Наконец, у вас есть проблемы с синтаксисом с вашей таблицей VEHICLE

CREATE TABLE VEHICLE (
       VIN_NUM    VARCHAR2(25) NOT NULL,
       V_MILEAGE  NUMBER(,0) NOT NULL ,
       V_GASUSED VARCHAR2(25) NOT NULL ,
       V_ELECTRICALMILES NUMBER(,0) NOT NULL ,
       DRIVER_ID VARCHAR2(25 BYTE) NOT NULL ,
 CONSTRAINT VEHICLE_PK PRIMARY KEY (VIN_NUM), CONSTRAINT VEHICLE_FK1 FOREIGN KEY (DRIVER_ID) REFERENCES DRIVER (DRIVER_ID) );

2 столбца NUMBER определены как NUMBER (, 0) - это недопустимо. Я заметил это довольно легко, когда вставил ваш код в SQL Developer, парсер выдает индикатор, что он плохой, и средство форматирования прекратит форматирование кода, когда достигнет этой точки.

enter image description here

...