Вставьте новую запись в MySQL при добавлении идентификатора + 1 в другое поле, если значение поля равно нулю - PullRequest
0 голосов
/ 22 апреля 2020

Я изменяю свою программу, чтобы позволить пользователям определять обычный код для своих записей в одной из моих таблиц в базе данных. Итак, я добавляю новый столбец в свою базу данных, чтобы сохранить «локальный код» каждого элемента, определенного пользователем, в отличие от «универсального кода» элемента, который фактически является идентификатором записи в моей таблице. .

Итак, я хочу написать запрос SQL, который при вставке новой записи, если 'local_code' равен нулю (я могу определить это по PHP, но я открыт для SQL решения для этого также), он вставляет идентификатор элемента в 'local_code'. Примерно так:

INSERT INTO items (`field_1`, `local_code`, `field_2`, ...)
VALUES ('blah blah blah', PREVIOUS_RECORD_ID + 1, 'blah blah blah', ...); 

Итак, в основном мой вопрос состоит в том, как найти PREVIOUS_RECORD_ID без проблем с параллелизмом. Я не могу использовать LAST_INSERT_ID () здесь, и использование SELECT max (id) ИЗ элементов может вызвать проблемы параллелизма, если два пользователя добавляют новые записи одновременно.

Если кто-то может придумать решение с использованием MySQL триггеров ( как триггер, который обновляет local_code, если после вставки новой записи он становится нулевым), это тоже подойдет.

Заранее спасибо.

Пример:

Допустим, в моей базе данных есть три столбца: id, код, имя

id   | code | name
 1    AAA     blah blah blah1
 2    BBB     blah blah blah2

Теперь я хочу вставить новую запись. Если пользователь не ввел код, я хочу, чтобы мой запрос SQL сделал это

INSERT INTO items (`code`, `name`)
VALUES (3, 'blah blah blah3', ...); 

Но если пользователь ввел "CCC" для кода, он должен работать следующим образом:

INSERT INTO items (`code`, `name`)
VALUES ("CCC", 'blah blah blah3', ...); 

Я могу определить, является ли код нулевым или нет, используя PHP, чтобы определить, какой запрос SQL должен быть выполнен. Итак, моя настоящая проблема с первым случаем, когда код NULL. Кроме того, если у кого-то есть решение SQL, которое обрабатывает оба случая, это будет удивительно.

1 Ответ

1 голос
/ 22 апреля 2020

Насколько я понимаю:

  1. Мы имеем дело с 2 столбцами, я называю их универсальный_код и локальный_код
  2. универсальный_код является авто_инкрементом и всегда будет предыдущим_инсертом + 1
  3. Когда пользователь отправит данные

universal_code = auto_increment if local_code is not null local_code = submitted local_code value else local_code should be same as universal_code

Что бы я сделал:

Выполните эту операцию с двумя запросами, чтобы избежать проблем параллелизма , Вставьте, а затем обновите

  1. Вставьте строку с пустым local_code и верните недавно вставленный универсальный_код
  2. Проверьте local_code. Если local_code был нулевым, обновите строку с универсальным_кодом, иначе обновите строку с переданным значением local_code
...