База данных SQL - ПК и ФК - PullRequest
0 голосов
/ 03 июля 2018

Это уже мой код, он основан на шаблоне, но мой не работает, выдает ошибки о слишком большом количестве первичных ключей и пропущенных ключевых слов для таблиц изменения?

Я не уверен, с чего начать. Если я пытаюсь вставить какие-либо данные, то это также приводит к ошибкам с отсутствующими выражениями?

CREATE TABLE staff
(
   staff_id          INTEGER NOT NULL PRIMARY KEY,
   staff_name        VARCHAR (30) NOT NULL,
   staff_surname     VARCHAR (30) NOT NULL,
   branch            VARCHAR (10) NOT NULL,
   jobrole           VARCHAR (15) NOT NULL,
   staff_contactno   INTEGER NOT NULL,
   CONSTRAINT pk_staff PRIMARY KEY (staff_id)
);


CREATE TABLE property
(
   property_id           INTEGER NOT NULL PRIMARY KEY,
   owner_id              INTEGER NOT NULL,
   property_addressln1   VARCHAR (50) NOT NULL,
   property_addressln2   VARCHAR (50) NOT NULL,
   property_county       VARCHAR (26) NOT NULL,
   property_postcode     VARCHAR (7) NOT NULL,
   property_type         VARCHAR (15) NOT NULL,
   property_bedrooms     INTEGER NOT NULL,
   availability          VARCHAR (15) NOT NULL,
   valuation             INTEGER NOT NULL,
   fk1_owner_id          INTEGER NOT NULL,
   fk2_staff_id          INTEGER NOT NULL,
   fk3_client_id         INTEGER NOT NULL,
   CONSTRAINT pk_property PRIMARY KEY (property_id, fk1_owner_id)
);

CREATE TABLE owner
(
   owner_id           INTEGER NOT NULL PRIMARY KEY,
   owner_name         VARCHAR (30) NOT NULL,
   owner_surname      VARCHAR (30) NOT NULL,
   owner_addressln1   VARCHAR (50) NOT NULL,
   owner_addressln2   VARCHAR (50) NOT NULL,
   owner_county       VARCHAR (26) NOT NULL,
   owner_postcode     VARCHAR (7) NOT NULL,
   owner_contactno    INTEGER NOT NULL,
   owner_email        VARCHAR (50) NOT NULL UNIQUE,
   CONSTRAINT pk_owner PRIMARY KEY (owner_id)
);

CREATE TABLE client
(
   client_id          INTEGER NOT NULL PRIMARY KEY,
   client_name        VARCHAR (30) NOT NULL,
   client_surname     VARCHAR (30) NOT NULL,
   client_contactno   INTEGER NOT NULL,
   client_email       VARCHAR (50) NOT NULL,
   CONSTRAINT pk_client PRIMARY KEY (client_id)
);

ALTER TABLE property ADD CONSTRAINT fk1_property_to_owner FOREIGN KEY(fk1_owner_id) REFERENCES owner(owner_id) ON DELETE restrict on update cascade;



ALTER TABLE property ADD CONSTRAINT fk2_property_to_staff FOREIGN KEY(fk2_staff_id) REFERENCES staff(staff_id) ON DELETE restrict on update cascade;


ALTER TABLE property ADD CONSTRAINT
fk3_property_to_client FOREIGN KEY(fk3_client_id) REFERENCES client(client_id) ON DELETE restrict on update cascade;

Ответы [ 5 ]

0 голосов
/ 03 июля 2018
  • вы можете определить ограничение PRIMARY KEY один раз для каждой таблицы

  • , если вы определили ПЕРВИЧНЫЙ КЛЮЧ , у него уже будет НЕ НУЛЬ ограничение и не нужно упоминать больше.

Итак, давайте рассмотрим таблицу staff

(следующее предупреждение относится и к остальным остальным CREATE TABLE операторов)

Создать что как:

CREATE TABLE staff
(
   staff_id          INTEGER PRIMARY KEY,
   staff_name        VARCHAR (30) NOT NULL,
   staff_surname     VARCHAR (30) NOT NULL,
   branch            VARCHAR (10) NOT NULL,
   jobrole           VARCHAR (15) NOT NULL,
   staff_contactno   INTEGER NOT NULL
);

или как:

CREATE TABLE staff
(
   staff_id          INTEGER,
   staff_name        VARCHAR (30) NOT NULL,
   staff_surname     VARCHAR (30) NOT NULL,
   branch            VARCHAR (10) NOT NULL,
   jobrole           VARCHAR (15) NOT NULL,
   staff_contactno   INTEGER NOT NULL,
   CONSTRAINT pk_staff PRIMARY KEY (staff_id)   
);
  • Нет опции под названием ON UPDATE для создания FOREIGN KEY в Oracle .

  • Да, есть опция ON DELETE для создания FOREIGN KEY в Oracle

    как ON DELETE CASCADE или ON DELETE SET NULL , но НЕ ON DELETE RESTRICT

0 голосов
/ 03 июля 2018

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

Попробуйте это

CREATE TABLE staff
(
   staff_id          INTEGER NOT NULL,
   staff_name        VARCHAR (30) NOT NULL,
   staff_surname     VARCHAR (30) NOT NULL,
   branch            VARCHAR (10) NOT NULL,
   jobrole           VARCHAR (15) NOT NULL,
   staff_contactno   INTEGER NOT NULL,
   CONSTRAINT pk_staff PRIMARY KEY (staff_id)
);

CREATE TABLE owner
(
   owner_id           INTEGER NOT NULL,
   owner_name         VARCHAR (30) NOT NULL,
   owner_surname      VARCHAR (30) NOT NULL,
   owner_addressln1   VARCHAR (50) NOT NULL,
   owner_addressln2   VARCHAR (50) NOT NULL,
   owner_county       VARCHAR (26) NOT NULL,
   owner_postcode     VARCHAR (7) NOT NULL,
   owner_contactno    INTEGER NOT NULL,
   owner_email        VARCHAR (50) NOT NULL UNIQUE,
   CONSTRAINT pk_owner PRIMARY KEY (owner_id)
);

CREATE TABLE client
(
   client_id          INTEGER NOT NULL,
   client_name        VARCHAR (30) NOT NULL,
   client_surname     VARCHAR (30) NOT NULL,
   client_contactno   INTEGER NOT NULL,
   client_email       VARCHAR (50) NOT NULL,
   CONSTRAINT pk_client PRIMARY KEY (client_id)
);

CREATE TABLE property
(
   property_id           INTEGER NOT NULL,
   owner_id              INTEGER NOT NULL,
   property_addressln1   VARCHAR (50) NOT NULL,
   property_addressln2   VARCHAR (50) NOT NULL,
   property_county       VARCHAR (26) NOT NULL,
   property_postcode     VARCHAR (7) NOT NULL,
   property_type         VARCHAR (15) NOT NULL,
   property_bedrooms     INTEGER NOT NULL,
   availability          VARCHAR (15) NOT NULL,   
   valuation             INTEGER NOT NULL,   
   fk1_owner_id          INTEGER NOT NULL,
   fk2_staff_id          INTEGER NOT NULL,
   fk3_client_id         INTEGER NOT NULL,
   CONSTRAINT pk_property PRIMARY KEY (property_id, fk1_owner_id),
   CONSTRAINT fk1_property_to_owner FOREIGN KEY(fk1_owner_id) REFERENCES owner(owner_id) ON DELETE restrict on update cascade,
   CONSTRAINT fk2_property_to_staff FOREIGN KEY(fk2_staff_id) REFERENCES staff(staff_id) ON DELETE restrict on update cascade,
   CONSTRAINT fk3_property_to_client FOREIGN KEY(fk3_client_id) REFERENCES client(client_id) ON DELETE restrict on update cascade
);

Примечание. Я не уверен в назначении столбцов owner_id и fk1_owner_id в таблице свойств. Кажется, дубликат столбца. Если он повторяется, удалите столбец owner_id из таблицы свойств

0 голосов
/ 03 июля 2018
CREATE TABLE STAFF(

Staff_id    INTEGER NOT NULL PRIMARY KEY,
Staff_name  VARCHAR(30) NOT NULL,
Staff_surname   VARCHAR(30) NOT NULL,
Branch  VARCHAR(10) NOT NULL,
JobRole VARCHAR(15) NOT NULL,
Staff_contactno INTEGER NOT NULL,
-- Specify the PRIMARY KEY constraint for table "STAFF".
-- This indicates which attribute(s) uniquely identify each row of data.
CONSTRAINT  pk_STAFF PRIMARY KEY (Staff_id)
);

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

CREATE TABLE STAFF(

Staff_id    INTEGER NOT NULL PRIMARY KEY,
Staff_name  VARCHAR(30) NOT NULL,
Staff_surname   VARCHAR(30) NOT NULL,
Branch  VARCHAR(10) NOT NULL,
JobRole VARCHAR(15) NOT NULL,
Staff_contactno INTEGER NOT NULL
);

или

CREATE TABLE STAFF(

Staff_id    INTEGER NOT NULL,
Staff_name  VARCHAR(30) NOT NULL,
Staff_surname   VARCHAR(30) NOT NULL,
Branch  VARCHAR(10) NOT NULL,
JobRole VARCHAR(15) NOT NULL,
Staff_contactno INTEGER NOT NULL,
-- Specify the PRIMARY KEY constraint for table "STAFF".
-- This indicates which attribute(s) uniquely identify each row of data.
CONSTRAINT  pk_STAFF PRIMARY KEY (Staff_id)
);
0 голосов
/ 03 июля 2018

Что касается CREATE TABLE, вы не можете принудительно применять PK как в строке, так и в качестве ограничения:

CREATE TABLE STAFF
(
    Staff_id                                INTEGER NOT NULL ,
    Staff_name                              VARCHAR(30) NOT NULL,
    Staff_surname                           VARCHAR(30) NOT NULL,
    Branch                                  VARCHAR(10) NOT NULL,
    JobRole                                 VARCHAR(15) NOT NULL,
    Staff_contactno                         INTEGER NOT NULL,
    -- Specify the PRIMARY KEY constraint for table "STAFF".
    -- This indicates which attribute(s) uniquely identify each row of data.
    CONSTRAINT pk_STAFF PRIMARY KEY(Staff_id)
);

CREATE TABLE PROPERTY
(
    Property_id                             INTEGER NOT NULL,
    Owner_id                                INTEGER NOT NULL,
    Property_addressLn1                     VARCHAR(50) NOT NULL,
    Property_addressLn2                     VARCHAR(50) NOT NULL,
    Property_county                         VARCHAR(26) NOT NULL,
    Property_postcode                       VARCHAR(7) NOT NULL,
    Property_type                           VARCHAR(15) NOT NULL,
    Property_bedrooms                       INTEGER NOT NULL,
    Availability                            VARCHAR(15) NOT NULL,
    Valuation                               INTEGER NOT NULL,
    fk1_Owner_id                            INTEGER NOT NULL,
    fk2_Staff_id                            INTEGER NOT NULL,
    fk3_Client_id                           INTEGER NOT NULL,
    -- Specify the PRIMARY KEY constraint for table "PROPERTY".
    -- This indicates which attribute(s) uniquely identify each row of data.
    CONSTRAINT pk_PROPERTY PRIMARY KEY(Property_id, fk1_Owner_id)
);

CREATE TABLE OWNER
(
    Owner_id                                INTEGER NOT NULL,
    Owner_name                              VARCHAR(30) NOT NULL,
    Owner_surname                           VARCHAR(30) NOT NULL,
    Owner_addressLn1                        VARCHAR(50) NOT NULL,
    Owner_addressLn2                        VARCHAR(50) NOT NULL,
    Owner_county                            VARCHAR(26) NOT NULL,
    Owner_postcode                          VARCHAR(7) NOT NULL,
    Owner_contactno                         INTEGER NOT NULL,
    Owner_email                             VARCHAR(50) NOT NULL UNIQUE,
    -- Specify the PRIMARY KEY constraint for table "OWNER".
    -- This indicates which attribute(s) uniquely identify each row of data.
    CONSTRAINT pk_OWNER PRIMARY KEY(Owner_id)
);

CREATE TABLE CLIENT
(
    Client_id                               INTEGER NOT NULL,
    Client_name                             VARCHAR(30) NOT NULL,
    Client_surname                          VARCHAR(30) NOT NULL,
    Client_contactno                        INTEGER NOT NULL,
    Client_email                            VARCHAR(50) NOT NULL,
    -- Specify the PRIMARY KEY constraint for table "CLIENT".
    -- This indicates which attribute(s) uniquely identify each row of data.
    CONSTRAINT pk_CLIENT PRIMARY KEY(Client_id)
);

О ALTER, Oracle не поддерживает то, что вы пытаетесь сделать, см. документы

0 голосов
/ 03 июля 2018

Таблица может иметь только один первичный ключ. Вы пытаетесь создать 2

Первый: Staff_id INTEGER NOT NULL PRIMARY KEY, второй: CONSTRAINT pk_STAFF PRIMARY KEY (Staff_id)

Конечно, с тем же столбцом, но это не проверяется БД

удаляет первичный ключ после первой строки каждой таблицы, и он работает:

CREATE TABLE staff
(
   staff_id          INTEGER NOT NULL,
   staff_name        VARCHAR (30) NOT NULL,
   staff_surname     VARCHAR (30) NOT NULL,
   branch            VARCHAR (10) NOT NULL,
   jobrole           VARCHAR (15) NOT NULL,
   staff_contactno   INTEGER NOT NULL,
   -- Specify the PRIMARY KEY constraint for table "STAFF".
   -- This indicates which attribute(s) uniquely identify each row of data.
   CONSTRAINT pk_staff PRIMARY KEY (staff_id)
);

Следующее, что ON DELETE RESTRICT не поддерживается ORACLE

Последнее, что первичный ключ не должен меняться, поэтому on update не имеет смысла

...