Вопрос или проблема
Я пытаюсь обновить таблицу сотрудников с помощью этого кода
UPDATE employee
SET branch_id = 1
WHERE emp_id = 100;
это код, который использовался ранее, он длинный, так что терпите.
CREATE TABLE employee (
emp_id INT PRIMARY KEY,
first_name VARCHAR(40),
last_name VARCHAR(40),
birth_day DATE,
sex VARCHAR(1),
salary INT,
super_id INT,
branch_id INT
);
CREATE TABLE branch (
branch_id INT PRIMARY KEY,
branch_name VARCHAR(40),
mgr_id INT,
mgr_start_date DATE,
FOREIGN KEY (mgr_id) REFERENCES employee (emp_id) ON DELETE SET NULL
);
ALTER TABLE employee
ADD FOREIGN KEY (branch_id)
REFERENCES employee(emp_id)
ON DELETE SET NULL;
ALTER TABLE employee
ADD FOREIGN KEY (super_id)
REFERENCES employee (emp_id)
ON DELETE SET NULL;
CREATE TABLE client (
client_id INT PRIMARY KEY,
client_name VARCHAR(40),
branch_id INT,
FOREIGN KEY (branch_id) REFERENCES branch(branch_id) ON DELETE SET NULL
);
CREATE TABLE works_with (
emp_id INT,
client_id INT,
total_sales INT,
PRIMARY KEY (emp_id, client_id),
FOREIGN KEY (emp_id) REFERENCES employee (emp_id) ON DELETE CASCADE,
FOREIGN KEY (client_id) REFERENCES client(client_id) ON DELETE CASCADE
);
CREATE TABLE branch_supplier (
branch_id INT,
supplier_name VARCHAR (40),
supply_type VARCHAR(40),
PRIMARY KEY (branch_id, supplier_name),
FOREIGN KEY (branch_id) REFERENCES branch (branch_id) ON DELETE CASCADE
);
INSERT INTO employee VALUES (100, 'Дэвид', 'Уоллес', '1967-11-17', 'M', 250000, NULL, NULL);
INSERT INTO branch VALUES (1, 'Корпоративный', 100, '2006-02-09');
Я хочу обновить Дэвида Уоллеса, чтобы у него был внешний ключ branch_id, установленный на 1, и внешний ключ для emp_id, установленный на 100. Я получаю ошибку, которая говорит
“Ошибка: Невозможно добавить или обновить дочернюю строку: нарушается ограничение внешнего ключа (‘fun’. ’employee’ , CONSTRAINT ’employee_ibfk_1′ FOREIGN KEY (‘branch_id’) REFERENCES ’employee’ (’emp_id’) ON DELETE SET NULL)
Код ошибки: ER_NO_REFERENCED_ROW_2
Вам следует изменить это:
ALTER TABLE employee
ADD FOREIGN KEY (branch_id)
REFERENCES employee(emp_id)
ON DELETE SET NULL;
На это:
ALTER TABLE employee
ADD FOREIGN KEY (branch_id)
REFERENCES branch(branch_id)
ON DELETE SET NULL;
Ответ или решение
Ваша проблема связана с неправильным определением внешнего ключа для столбца branch_id
в таблице employee
. В данный момент он ссылается на поле emp_id
той же таблицы employee
, что является ошибочным, поскольку поле с идентификатором филиала должно ссылаться на таблицу branch
. Сообщение об ошибке, которое вы получаете, указывает на несоответствие, поскольку значение branch_id
, равное 1, отсутствует в таблице employee
.
Для корректного исправления этой ситуации вам необходимо изменить определение внешнего ключа для branch_id
, чтобы он ссылался на branch_id
в таблице branch
. Вы можете сделать это следующим образом:
-
Удалите неправильный внешний ключ:
ALTER TABLE employee DROP FOREIGN KEY employee_ibfk_1; -- замените на реальное имя ограничения
-
Добавьте правильный внешний ключ:
ALTER TABLE employee ADD FOREIGN KEY (branch_id) REFERENCES branch(branch_id) ON DELETE SET NULL;
Теперь ваша структура базы данных будет корректно организована, и обновление записи будет работать правильно. После внесения исправлений вы сможете запустить ваш запрос:
UPDATE employee
SET branch_id = 1
WHERE emp_id = 100;
Это должно решить вашу проблему.
Итак, итоговые шаги:
- Удалите неправильный внешний ключ для
branch_id
. - Добавьте правильный внешний ключ для
branch_id
, который ссылается наbranch(branch_id)
. - Выполните обновление.
После этих изменений у вас не должно возникнуть проблем с добавлением или обновлением строк в вашей таблице employee
, если все другие состояния базы данных корректны.