#sql #oracle #oracle-apex
#sql #Oracle #oracle-apex
Вопрос:
Я получаю «отсутствующую или недопустимую опцию» при запуске этого скрипта (полная ошибка: ORA-00922: отсутствует или недопустимая опция ORA-06512: в «SYS.WWV_DBMS_SQL_APEX_200100», строка 581 ORA-06512: в «SYS.DBMS_SYS_SQL», строка 1658 ORA-06512: в «SYS.WWV_DBMS_SQL_APEX_200100», строка 567 ORA-06512: в «APEX_200100.WWV_FLOW_DYNAMIC_EXEC», строка 2127). Рассматриваемое утверждение — «СОЗДАТЬ ПРОИЗВОДИТЕЛЯ ТАБЛИЦЫ (m_name VARCHAR2 (50), m_id». Что я должен сделать, чтобы это исправить?
DROP TABLE vehicles CASCADE constraints;
DROP TABLE suppliers CASCADE constraints;
DROP TABLE manufacturer CASCADE constraints;
CREATE TABLE vehicles
(VIN VARCHAR2(17),
brand VARCHAR2(20),
model VARCHAR2(20),
color VARCHAR2(10),
PRIMARY KEY (VIN, brand, model, color)
);
CREATE TABLE suppliers
(s_name VARCHAR2(20),
s_id VARCHAR2(15),
part_id VARCHAR2(20),
supply_date VARCHAR2(15),
PRIMARY KEY (s_name, s_id, part_id, supply_date)
);
CREATE TABLE manufacturer
(m_name VARCHAR2(50),
m_id VARCHAR2(15),
s_name VARCHAR2(20),
VIN VARCHAR2(17)),
PRIMARY KEY (m_name, m_id)),
FOREIGN KEY (s_name) REFERENCES suppliers
ON DELETE SET NULL
FOREIGN KEY (VIN) REFERENCES vehicles
ON DELETE SET NULL
);
--LOAD DATABASE
INSERT INTO vehicles VALUES ('JM1CW2BL4D0154490', 'Mazda', 'Mazda5', 'Brown');
INSERT INTO suppliers VALUES ('MNAO Supplier', 'MNAO', '308', '01/28/2013');
INSERT INTO manufacturer VALUES ('Mazda Motor Corp', 'MZDAY', 'MNAO Supplier', 'JM1CW2BL4D0154490');
Комментарии:
1. У вас есть несколько дополнительных закрывающих круглых скобок, которых там не должно быть, как в
PRIMARY KEY (m_name, m_id))
. Тогда определение внешних ключей недопустимо SQL: вам необходимо указать имена столбцов в родительской таблице, например:FOREIGN KEY (s_name) REFERENCES suppliers(s_name) ON DELETE SET NULL
. Но даже в этом случае: внешние ключи неверно сформированы: вы можете ссылаться только на первичный ключ (или набор уникальных столбцов) в родительской таблице, а это не то, что вы здесь делаете. Вероятно, вам нужно переосмыслить свой дизайн.2. Ах, спасибо. Я не уловил скобки. Я также исправил внешние ключи и настроил новый дизайн с «ОГРАНИЧЕНИЕМ», рекомендованным MT0.
Ответ №1:
Идентификационный номер транспортного средства (VIN) уникален; вам не нужны никакие другие столбцы для создания первичного ключа, чтобы ваша vehicles
таблица могла быть:
CREATE TABLE vehicles(
VIN VARCHAR2(17)
CONSTRAINT vehicles__vin__pk PRIMARY KEY,
brand VARCHAR2(20)
CONSTRAINT vehicles__brand__nn NOT NULL,
model VARCHAR2(20)
CONSTRAINT vehicles__model__nn NOT NULL,
color VARCHAR2(10)
CONSTRAINT vehicles__color__nn NOT NULL
);
Аналогично, вы, вероятно, хотите использовать только один столбец в качестве первичного ключа suppliers
(и должны хранить значения даты в качестве DATE
типа данных):
CREATE TABLE suppliers (
s_name VARCHAR2(20)
CONSTRAINT suppliers__s_name__pk PRIMARY KEY,
s_id VARCHAR2(15)
CONSTRAINT suppliers__s_id__nn NOT NULL,
part_id VARCHAR2(20)
CONSTRAINT suppliers__part_id__nn NOT NULL,
supply_date DATE
CONSTRAINT suppliers__supply_date__nn NOT NULL
);
Тогда ваша manufacturer
таблица может быть:
CREATE TABLE manufacturer(
m_name VARCHAR2(50),
m_id VARCHAR2(15),
s_name VARCHAR2(20)
CONSTRAINT manufacturer__s_name__fk
REFERENCES suppliers (s_name) ON DELETE SET NULL,
VIN VARCHAR2(17)
CONSTRAINT manufacturer__vin__fk
REFERENCES vehicles (vin) ON DELETE SET NULL,
CONSTRAINT manufacturer__m_name__m_id__pk PRIMARY KEY (m_name, m_id)
);
(Опять же, вы, вероятно, захотите изменить его, чтобы только один столбец был первичным ключом.)
Затем вы можете вставить свои данные:
INSERT INTO vehicles VALUES ('JM1CW2BL4D0154490', 'Mazda', 'Mazda5', 'Brown');
INSERT INTO suppliers VALUES ('MNAO Supplier', 'MNAO', '308', DATE '2013-01-28');
INSERT INTO manufacturer VALUES ('Mazda Motor Corp', 'MZDAY', 'MNAO Supplier', 'JM1CW2BL4D0154490');
(и не передавайте даты в виде строк, используйте TO_DATE
или литерал даты.)
db<> скрипка здесь
Комментарии:
1. Большое вам спасибо! Я планирую реализовать больше запросов и использовать этот метод. Сегодня я, конечно, узнал кое-что новое.