Не удается добавить или обновить строку дочерней таблицы: не выполнено ограничение внешнего ключа (‘fun’. ’employee’, ОГРАНИЧЕНИЕ ’employee_ibfk_1′)

Вопрос или проблема

Я пытаюсь обновить таблицу сотрудников с помощью этого кода

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. Вы можете сделать это следующим образом:

  1. Удалите неправильный внешний ключ:

    ALTER TABLE employee
    DROP FOREIGN KEY employee_ibfk_1;  -- замените на реальное имя ограничения
  2. Добавьте правильный внешний ключ:

    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;

Это должно решить вашу проблему.

Итак, итоговые шаги:

  1. Удалите неправильный внешний ключ для branch_id.
  2. Добавьте правильный внешний ключ для branch_id, который ссылается на branch(branch_id).
  3. Выполните обновление.

После этих изменений у вас не должно возникнуть проблем с добавлением или обновлением строк в вашей таблице employee, если все другие состояния базы данных корректны.

Оцените материал
Добавить комментарий

Капча загружается...