Oracle Data Modeler - ограничение уже существует
Я новичок в Oracle Data Modeler и пытаюсь создать диаграмму ER для гипотетической компании, где у нее может быть много торговых точек (Outlet), со многими отделами (Department) и множеством сотрудников (Staff).
Я выбрал отношения 1:N
Идентификация взаимосвязей для создания составного ключа как для отдела, так и для персонала. Я решил сделать это, потому что каждый идентификатор отдела связан с идентификатором торговой точки, а сотрудники связаны с торговой точкой.
Возможно, это неправильные отношения, потому что когда я проектирую диаграмму, а затем извлекаю код из редактора файлов DDL и запускаю его, я получаю несколько ошибок, подобных этой:
ALTER TABLE stock
ADD CONSTRAINT stock_products_fk
FOREIGN KEY ( products_product_id )
REFERENCES products ( product_id )
Сообщение об ошибке
ORA-02275: such a referential constraint already exists in the table
02275. 00000 - "такое ссылочное ограничение уже существует в таблице" * Причина: Самоочевидно. * Действие: убрать лишнее ограничение.
Действие довольно простое - я должен удалить дополнительное ограничение, но это заставляет меня задаться вопросом, почему оно вообще есть, и означает ли это, что мой метод неверен?
Код для создания таблиц ниже, вместе с моей диаграммой ER. Я думаю, что отношения между таблицами вызывают проблему. Любая помощь с благодарностью. Спасибо
CREATE TABLE department (
department_id VARCHAR2(20) NOT NULL,
outlet_outlet_id VARCHAR2(20) NOT NULL,
department_name VARCHAR2(30),
department_floor_area INTEGER
);
ALTER TABLE department ADD CONSTRAINT department_pk PRIMARY KEY ( outlet_outlet_id,
department_id );
CREATE TABLE outlet (
outlet_id VARCHAR2(20) NOT NULL,
outlet_address VARCHAR2(40),
outlet_phone_no INTEGER,
outlet_size INTEGER,
outlet_floor_size INTEGER
);
ALTER TABLE outlet ADD CONSTRAINT outlet_pk PRIMARY KEY ( outlet_id );
CREATE TABLE products (
product_id VARCHAR2(20) NOT NULL,
product_description VARCHAR2(30),
currently_supplied BLOB,
sales_category_sales_cat_id VARCHAR2(20) NOT NULL,
supplier_supplier_id VARCHAR2(20) NOT NULL
);
ALTER TABLE products ADD CONSTRAINT products_pk PRIMARY KEY ( product_id );
CREATE TABLE sales_category (
sales_cat_id VARCHAR2(20) NOT NULL,
sales_category_description VARCHAR2(30)
);
ALTER TABLE sales_category ADD CONSTRAINT sales_category_pk PRIMARY KEY ( sales_cat_id );
CREATE TABLE staff (
staff_id VARCHAR2(20) NOT NULL,
outlet_outlet_id VARCHAR2(20) NOT NULL,
staff_name VARCHAR2(30),
staff_phone_no INTEGER,
staff_mgmt_status BLOB
);
ALTER TABLE staff ADD CONSTRAINT staff_pk PRIMARY KEY ( outlet_outlet_id,
staff_id );
CREATE TABLE stock (
products_product_id VARCHAR2(20) NOT NULL,
stock_id VARCHAR2(20) NOT NULL,
number_of_products INTEGER,
outlet_outlet_id VARCHAR2(20) NOT NULL
);
ALTER TABLE stock ADD CONSTRAINT stock_pk PRIMARY KEY ( products_product_id,
stock_id );
CREATE TABLE supplier (
supplier_id VARCHAR2(20) NOT NULL,
supplier_name VARCHAR2(40),
supplier_address VARCHAR2(40)
);
ALTER TABLE supplier ADD CONSTRAINT supplier_pk PRIMARY KEY ( supplier_id );
ALTER TABLE department
ADD CONSTRAINT department_outlet_fk FOREIGN KEY ( outlet_outlet_id )
REFERENCES outlet ( outlet_id );
ALTER TABLE products
ADD CONSTRAINT products_sales_category_fk FOREIGN KEY ( sales_category_sales_cat_id )
REFERENCES sales_category ( sales_cat_id );
ALTER TABLE products
ADD CONSTRAINT products_supplier_fk FOREIGN KEY ( supplier_supplier_id )
REFERENCES supplier ( supplier_id );
ALTER TABLE staff
ADD CONSTRAINT staff_outlet_fk FOREIGN KEY ( outlet_outlet_id )
REFERENCES outlet ( outlet_id );
ALTER TABLE stock
ADD CONSTRAINT stock_outlet_fk FOREIGN KEY ( outlet_outlet_id )
REFERENCES outlet ( outlet_id );
ALTER TABLE stock
ADD CONSTRAINT stock_products_fk FOREIGN KEY ( products_product_id )
REFERENCES products ( product_id );
ALTER TABLE department
ADD CONSTRAINT department_outlet_fk FOREIGN KEY ( outlet_outlet_id )
REFERENCES outlet ( outlet_id );
ALTER TABLE products
ADD CONSTRAINT products_sales_category_fk FOREIGN KEY ( sales_category_sales_cat_id )
REFERENCES sales_category ( sales_cat_id );
ALTER TABLE products
ADD CONSTRAINT products_supplier_fk FOREIGN KEY ( supplier_supplier_id )
REFERENCES supplier ( supplier_id );
ALTER TABLE staff
ADD CONSTRAINT staff_outlet_fk FOREIGN KEY ( outlet_outlet_id )
REFERENCES outlet ( outlet_id );
ALTER TABLE stock
ADD CONSTRAINT stock_outlet_fk FOREIGN KEY ( outlet_outlet_id )
REFERENCES outlet ( outlet_id );
ALTER TABLE stock
ADD CONSTRAINT stock_products_fk FOREIGN KEY ( products_product_id )
REFERENCES products ( product_id );
1 ответ
Я подозреваю, что есть проблема с тем, как вы извлекаете DDL из модели - вы получаете это утверждение дважды:
ALTER TABLE stock
ADD CONSTRAINT stock_outlet_fk FOREIGN KEY ( outlet_outlet_id )
REFERENCES outlet ( outlet_id );
...
ALTER TABLE stock
ADD CONSTRAINT stock_outlet_fk FOREIGN KEY ( outlet_outlet_id )
REFERENCES outlet ( outlet_id );
Я ожидал бы, что это потерпит неудачу с этой ошибкой, когда он доберется до 2-й копии заявления.
Просто попробуйте использовать "/" вместо ";". Для меня проблема была в точке с запятой.