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-й копии заявления.

Просто попробуйте использовать "/" вместо ";". Для меня проблема была в точке с запятой.

Другие вопросы по тегам