@ukoHka
Всего понемногу

Как вставить id текущей записи в другой столбец в Mysql?

Есть таблица объектов, в которой есть поля id (PRIMARY, AUTO_INCREMENT) и related_to (отношение)
По умолчанию каждый объект должен относится к самому себе (чтобы при выборе основного объекта можно было получить все относящиеся к нему объекты, включая его самого).
В интернете нашел пример триггера BEFORE INSERT:
IF NEW.related_to = 0 THEN
    SET NEW.related_to = last_insert_id()+1 ;
  END IF

Но этот код все время устанавливает related_to в 1, то есть last_insert_id() возвращает 0. Читал, что это может быть из-за того, что при каждом запросе создается новое соединение и last_insert_id обнуляется, но использование постоянного соединения не рекомендуется, и также не решает проблемы, когда объекты добавляют разные люди с разными соединениями (у каждого будет идти свой счетчик last_insert_id).
Хотя может быть я неправильно понимаю и постоянное соединение создается для самих скриптов, в таком случае проблема должны вроде как решиться, но у меня происходит что-то странное и вставляются левые id (id записей, вставляемых в другие таблицы одновременно с этой записью)
  • Вопрос задан
  • 182 просмотра
Решения вопроса 1
webinar
@webinar
Учим yii: https://youtu.be/-WRMlGHLgRg
Меня смущает отношение сам к себе - это наверняка будет циклы бесконечные вызывать. И вообще не понимаю зачем это может понадобится. Есть подозрение в корне не верном подходе к организации БД и взаимосвязях.
Но что бы получить возможность внести свой id только что созданной записи есть в моделе метод afterSave www.yiiframework.com/doc-2.0/yii-db-baseactivereco...

last_insert_id()+1 - это путь к провалу

Не совсем понятно связь какая у Вас? Это один к одному, один ко многим или многие ко многим? Если многие ко многим то должна быть отдельная таблица где храниться зависимости.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@RidgeA
c last_insert_id могут быть проблемы при конкурентных запросах
Может лучше использовать after insert триггер ?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы