Ошибка: 1452 - Ошибка операции вставки после добавления триггера - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть следующая схема:

таблица пользователя:

+---------------+--------------+------+-----+-------------------+-------------------+
| Field         | Type         | Null | Key | Default           | Extra             |
+---------------+--------------+------+-----+-------------------+-------------------+
| user_id       | int          | NO   | PRI | NULL              | auto_increment    |
| account_type  | varchar(10)  | NO   |     | NULL              |                   |
+---------------+--------------+------+-----+-------------------+-------------------+

таблица ученика:

+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| student_id     | int          | NO   | PRI | NULL    | auto_increment |
| user_id        | int          | YES  | MUL | NULL    |                |
| specialization | varchar(50)  | YES  |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+

Таблица user_id в таблице ученика является внешним ключом из user таблицы. Добавление данных в обе таблицы по порядку работало хорошо, пока я не ввел этот триггер

create trigger after_user_insert
-> after insert on user for each row
-> begin
-> if new.account_type like 'student' then
-> insert into student(user_id) values (LAST_INSERT_ID());
-> end if;
-> end;//

Теперь он дает

Ошибка 1452: (23000): Невозможно добавить или обновить дочерняя строка: сбой ограничения внешнего ключа (studentmanager. student, CONSTRAINT student_ibfk_1 FOREIGN KEY (user_id) ССЫЛКИ user (user_id))

1 Ответ

2 голосов
/ 04 апреля 2020

Это действительно заняло у меня некоторое время, чтобы обрести голову, хе-хе.

CREATE TRIGGER after_user_insert
AFTER insert ON user
FOR EACH ROW
insert into student(user_id) SELECT (user_id) FROM user 
WHERE new.account_type LIKE 'student' ORDER BY user_id DESC LIMIT 1;

РЕЗУЛЬТАТ:

Схема (MySQL v8.0)

**Query #1**

    SELECT * FROM user;

| user_id | account_type |
| ------- | ------------ |
| 1       | student      |
| 2       | student      |
| 3       | not          |
| 4       | student      |
| 5       | student      |
| 6       | not          |
| 7       | not          |
| 8       | student      |

---
**Query #2**

    SELECT * FROM student;

| student_id | user_id |
| ---------- | ------- |
| 1          | 1       |
| 2          | 2       |
| 3          | 4       |
| 4          | 5       |
| 5          | 8       |

---

Посмотреть этот рабочий пример на DB Fiddle

Я не эксперт, и я делаю это для развлечения, поэтому кто-то, пожалуйста, поправьте меня, если я ошибаюсь. Я считаю, что вы не можете иметь как без выбора. Как и LAST_INSERT_ID (). И я забыл в процессе этого, что было не так с ключами, но здесь, очевидно, было несколько вещей не так. Я ДУМАЮ.

Я бы тоже не отказался от второго мнения по поводу моего запроса. Но насколько я проверял, это правильно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...