2016-02-11 3 views
1

Таблицы будут строить, но каждый раз, когда я пытаюсь вставить значения в таблицу, я получаю ошибку 1452 ограничений внешнего ключа. Интересно, имеет ли проблема проблема с таблицей EMPLOYEE внешний ключ для STORE_CODE в таблице STORE, а таблица STORE имеет внешний ключ для EMP_CODE в таблице EMPLOYEE. Является ли циркуляр ссылкой здесь проблемой?Каков правильный способ иметь внешние ключи в таблицах, которые ссылаются друг на друга

ALTER TABLE EMPLOYEE DROP FOREIGN KEY STORE_CD; 
ALTER TABLE STORE DROP FOREIGN KEY REGION_CD; 
ALTER TABLE STORE DROP FOREIGN KEY EMPLOYEE_CD; 

DROP TABLE IF EXISTS EMPLOYEE, REGION, STORE; 

CREATE TABLE EMPLOYEE (
    EMP_CODE int NOT NULL PRIMARY KEY, 
    EMP_TITLE varchar(4), 
    EMP_LNAME varchar(15), 
    EMP_FNAME varchar(15), 
    EMP_INITIAL varchar(1), 
    EMP_DOB datetime, 
    STORE_CODE int NOT NULL 
) Engine=InnoDB; 

-- Table Region 
CREATE TABLE REGION (
    REGION_CODE int NOT NULL PRIMARY KEY, 
    REGION_DESCRIPT varchar(20) 
) Engine=InnoDB; 

-- Table Store 
CREATE TABLE STORE (
    STORE_CODE int NOT NULL PRIMARY KEY, 
    STORE_NAME varchar(20) NOT NULL, 
    STORE_YTD_SALES numeric NOT NULL, 
    REGION_CODE int NOT NULL, 
    EMP_CODE int NOT NULL 
) Engine=InnoDB; 



ALTER TABLE EMPLOYEE ADD CONSTRAINT STORE_CD 
     FOREIGN KEY STORE_CD(STORE_CODE) REFERENCES STORE(STORE_CODE); 

ALTER TABLE STORE ADD CONSTRAINT REGION_CD 
     FOREIGN KEY REGION_CD(REGION_CODE) REFERENCES REGION(REGION_CODE); 

ALTER TABLE STORE ADD CONSTRAINT EMPLOYEE_CD 
     FOREIGN KEY EMPLOYEE_CD(EMP_CODE) REFERENCES EMPLOYEE(EMP_CODE); 
+0

Почему в первую очередь стоит код сотрудника в таблице магазинов? Есть ли в каждом магазине только один сотрудник? Это специальный сотрудник, как менеджер? – Barmar

+0

Да, код сотрудника в магазине должен представлять менеджера или районного менеджера. – WP0987

ответ

0

В моем опыте работы с реляционными базами данных, я думаю, вы должны создать промежуточную таблицу , чтобы связать «магазин» с «сотрудником» (давайте назовите его (store_has_employee) с атрибутами (idstore (fk), idemployee (fk) и isManager (boolean))

Затем вы должны сначала вставить «регионы», чтобы вы могли вставить «магазин», а затем, когда вы зарегистрировали «служащих», все, что вам нужно сделать, это связать их с «store_has_employee», , и если вы хотите сказать, что это менеджер, просто вставьте isManager = true.

Это самый эффективный способ сделать это и получить более быстрые запросы.

Надеюсь, что это поможет.

2

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

Таким образом, необходимо, чтобы столбец ссылок был NULL. Затем вы можете добавить строку в первую таблицу с NULL в столбец ссылок, добавить строку во вторую таблицу, а затем заполнить столбец ссылок в первой таблице с идентификатором из второй таблицы.

0

Какой из них вы хотите вставить первым? Если EMPLOYEE затем сделает STORE_CD (nullable = true) в EMPLOYEE После этого добавьте элемент STORE с идентификатором EMPLOYEE и обновите EMPLOYEE с помощью кода хранилища. Вы можете использовать транзакцию для всего этого процесса.

0

Из-за моего непонимания SQL, самым простым решением для меня было удалить внешний ключ из таблицы employee, чтобы у меня не было круговой ссылки. Затем заполнить таблицу сотрудников сначала другими таблицами.

Смежные вопросы