Какое утверждение необходимо пересмотреть? - PullRequest
0 голосов
/ 02 апреля 2020

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

CREATE TABLE server 
(
SERVER_ID       varchar(25) NOT NULL,
SERVER_IP       varchar(15)     NOT NULL,
SERVER_LOCATION     varchar(25)     NOT NULL,
SERVER_BRAND    varchar(15)     NOT NULL,
CONSTRAINT server_pk
PRIMARY KEY (SERVER_ID)
);

CREATE TABLE application
(
APP_ID          varchar(25) NOT NULL,
ACCOUNT_NUM varchar(25)     NOT NULL,
RECORD_ID       varchar(10)     NOT NULL,
VERSION_ID      varchar(10)     NOT NULL,
LAST_UPDATED        date        NOT NULL,
CONSTRAINT application_pk
PRIMARY KEY (APP_ID),
CONSTRAINT application _fk_account
FOREIGN KEY (ACCOUNT_NUM)   
REFERENCES account (ACCOUNT_NUM),
CONSTRAINT application _fk_record
FOREIGN KEY (RECORD_ID)         
REFERENCES record (RECORD_ID)
);

CREATE TABLE record
(
RECORD_ID       varchar(25) NOT NULL,
VIN_NUM         varchar(25)     NOT NULL,
SERVER_ID       varchar(25)     NOT NULL,
CONSTRAINT record_pk
PRIMARY KEY (RECORD_ID, VIN_NUM, SERVER_ID),
CONSTRAINT record_fk_vehicle
FOREIGN KEY (VIN_NUM)   
REFERENCES vehicle (VIN_NUM),
CONSTRAINT record_fk_server
FOREIGN KEY (SERVER_ID)
REFERENCES server (SERVER_ID)
);

CREATE TABLE vehicle
(
VIN_NUM     varchar(25) NOT NULL,
V_MILEAGE       int         NOT NULL,
V_GASUSED       varchar(25)     NOT NULL,
V_ELECTRICALMILES   int         NOT NULL,
DRIVER_ID       varchar(25) NOT NULL,
CONSTRAINT vehicle_pk
PRIMARY KEY (VIN_NUM),
CONSTRAINT vehicle_fk_driver
FOREIGN KEY (DRIVER_ID) 
REFERENCES driver (DRIVER_ID)
);

CREATE TABLE driver
(
DRIVER_ID       varchar(25) NOT NULL,
LICENSE_NUM     varchar(25) NOT NULL,
FIRST_NAME      varchar(25) NOT NULL,
LAST_NAME       varchar(25)     NOT NULL,
INSURANCE_POLICY    varchar(25) NOT NULL,
ACCOUNT_NUM int     NOT NULL,
CONSTRAINT driver_pk
PRIMARY KEY (DRIVER_ID),
CONSTRAINT driver_fk_account
FOREIGN KEY (ACCOUNT_NUM)   
REFERENCES account (ACCOUNT_NUM)
);

CREATE TABLE account
(
ACCOUNT_NUM int     NOT NULL,
DRIVER_ID       varchar(25) NOT NULL,
DEVICE_ID       varchar(25) NOT NULL,
DATE_CREATED        date        NOT NULL,
ACCOUNT_STATUS  varchar(10) NOT NULL,
CONSTRAINT account_pk
PRIMARY KEY         (ACCOUNT_NUM, DRIVER_ID),
CONSTRAINT account_fk_driver
FOREIGN KEY (DRIVER_ID)     
REFERENCES driver (DRIVER_ID)
);

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Здесь есть несколько проблем.

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

Хороший обходной путь для этого - удалить ограничения внешнего ключа из create table и создать их отдельно (используя alter table ... add constraint) после создания всех таблиц.

Нет проблем, если две таблицы ссылаются друг на друга (например, driver и account do), если для этого есть веская причина. Однако, как я уже говорил, вы не можете сделать это в пределах операторов create table; по крайней мере один внешний ключ должен быть удален.

Если первичный ключ состоит из нескольких столбцов (так что это составной ключ), внешний ключ также должен содержать то же число и типы данных столбцов, которые на него ссылаются. Это то, что у вас есть для driver и account таблиц.

  • account Первичный ключ (account_num, driver_id)
  • driver может использовать внешний ключ не просто (account_num) - он также должен содержать driver_id

Наконец, application таблица: его внешние ключи не могут быть созданы, потому что он ссылается на

  • account таблица с первичным ключом (account_num, driver_id), но - application вообще не содержит столбец driver_id, что может означать, что вы неправильно установили первичный ключ account (или application таблица)
  • record таблица, в которой включен составной первичный ключ (record_id, vin_num, server_id), в то время как application имеет только record_id. Замечание, которое я написал для account, действует и здесь

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

SQL> CREATE TABLE server
  2  (
  3  SERVER_ID       varchar2(25) NOT NULL,
  4  SERVER_IP       varchar2(15)     NOT NULL,
  5  SERVER_LOCATION     varchar2(25)     NOT NULL,
  6  SERVER_BRAND    varchar2(15)     NOT NULL,
  7  CONSTRAINT server_pk
  8  PRIMARY KEY (SERVER_ID)
  9  );

Table created.

SQL>
SQL> CREATE TABLE driver
  2  (
  3  DRIVER_ID       varchar2(25) NOT NULL,
  4  LICENSE_NUM     varchar2(25) NOT NULL,
  5  FIRST_NAME      varchar2(25) NOT NULL,
  6  LAST_NAME       varchar2(25)     NOT NULL,
  7  INSURANCE_POLICY    varchar2(25) NOT NULL,
  8  ACCOUNT_NUM int     NOT NULL,
  9  CONSTRAINT driver_pk
 10  PRIMARY KEY (DRIVER_ID)
 11  --CONSTRAINT driver_fk_account
 12  --FOREIGN KEY (ACCOUNT_NUM)
 13  --REFERENCES account (ACCOUNT_NUM)
 14  );

Table created.

SQL>
SQL> CREATE TABLE account
  2  (
  3  ACCOUNT_NUM int     NOT NULL,
  4  DRIVER_ID       varchar2(25) NOT NULL,
  5  DEVICE_ID       varchar2(25) NOT NULL,
  6  DATE_CREATED        date        NOT NULL,
  7  ACCOUNT_STATUS  varchar2(10) NOT NULL,
  8  CONSTRAINT account_pk
  9  PRIMARY KEY         (ACCOUNT_NUM, DRIVER_ID),
 10  CONSTRAINT account_fk_driver
 11  FOREIGN KEY (DRIVER_ID)
 12  REFERENCES driver (DRIVER_ID)
 13  );

Table created.

SQL>
SQL> alter table driver add constraint driver_fk_account
  2  foreign key (account_num, driver_id)
  3  references account (account_num, driver_id);

Table altered.

SQL>
SQL> CREATE TABLE vehicle
  2  (
  3  VIN_NUM     varchar2(25) NOT NULL,
  4  V_MILEAGE       int         NOT NULL,
  5  V_GASUSED       varchar2(25)     NOT NULL,
  6  V_ELECTRICALMILES   int         NOT NULL,
  7  DRIVER_ID       varchar2(25) NOT NULL,
  8  CONSTRAINT vehicle_pk
  9  PRIMARY KEY (VIN_NUM),
 10  CONSTRAINT vehicle_fk_driver
 11  FOREIGN KEY (DRIVER_ID)
 12  REFERENCES driver (DRIVER_ID)
 13  );

Table created.

SQL>
SQL> CREATE TABLE record
  2  (
  3  RECORD_ID       varchar2(25) NOT NULL,
  4  VIN_NUM         varchar2(25)     NOT NULL,
  5  SERVER_ID       varchar2(25)     NOT NULL,
  6  CONSTRAINT record_pk
  7  PRIMARY KEY (RECORD_ID, VIN_NUM, SERVER_ID),
  8  CONSTRAINT record_fk_vehicle
  9  FOREIGN KEY (VIN_NUM)
 10  REFERENCES vehicle (VIN_NUM),
 11  CONSTRAINT record_fk_server
 12  FOREIGN KEY (SERVER_ID)
 13  REFERENCES server (SERVER_ID)
 14  );

Table created.

SQL>
SQL> CREATE TABLE application
  2  (
  3  APP_ID          varchar2(25) NOT NULL,
  4  ACCOUNT_NUM varchar2(25)     NOT NULL,
  5  RECORD_ID       varchar2(10)     NOT NULL,
  6  VERSION_ID      varchar2(10)     NOT NULL,
  7  LAST_UPDATED        date        NOT NULL,
  8  CONSTRAINT application_pk
  9  PRIMARY KEY (APP_ID)
 10  --CONSTRAINT application_fk_account
 11  --FOREIGN KEY (ACCOUNT_NUM)
 12  --REFERENCES account (ACCOUNT_NUM),
 13  --CONSTRAINT application_fk_record
 14  --FOREIGN KEY (RECORD_ID)
 15  --REFERENCES record (RECORD_ID)
 16  );

Table created.

SQL>
0 голосов
/ 02 апреля 2020

Вы должны добавить / после каждого определения таблицы -

CREATE TABLE server 
(
SERVER_ID       varchar(25) NOT NULL,
SERVER_IP       varchar(15)     NOT NULL,
SERVER_LOCATION     varchar(25)     NOT NULL,
SERVER_BRAND    varchar(15)     NOT NULL,
CONSTRAINT server_pk
PRIMARY KEY (SERVER_ID)
);
/         ---->   Here
CREATE TABLE application
(
APP_ID          varchar(25) NOT NULL,
.....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...