2015-07-27 6 views
4

Мне нужно добавить новый продукт в таблицу. Но для этого мне нужно проверить SKU последнего вставленного продукта и увеличить его на 1 и вставить в него новые детали продукта. SKU - это что-то вроде SKUNXXXXX - X - это цифра. Изменение структуры таблицы невозможно.Вставить строку с одним значением столбца на основе последней записи

Возможные решения, которые я могу думать о

  • Получить последнюю строку, используя заказ и ограничения 1.
  • заменить «SKUN» с пустой строкой и увеличить число на 1
  • Вставка записи с сведения о продукте и приращение значения SKU

Но эта ситуация может создать проблему (хотя я не уверен в этом). Проблема в том, что, если только после получения последней записи и перед вставкой новых сведений о продукте, другой запрос приходит и получает одну и ту же последнюю запись? В этом случае оба продукта имеют один и тот же SKU.

Пожалуйста, дайте мне знать, как решить эту ситуацию.

+3

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

+0

Почему вместо столбца с символом не используется столбец с автоматическим приращением? – Barmar

+0

@Barmar - я знаю, что автоинкрементный столбец - лучший способ, но я не могу его изменить, поскольку предыдущий разработчик использовал его во многих местах, и он сломает вещи. Спасибо за ваше предложение. –

ответ

0

Одним из вариантов было бы создать автоинкремент id, а затем использовать его для создания SKU для каждого продукта по мере его ввода. Затем можно использовать триггер, который запускал бы после INSERT, для назначения SKU для вновь вставленного продукта. Но, увы, MySQL не позволяет триггеру изменять таблицу, в которой она была запущена.

Однако здесь есть потенциально простое решение проблемы. Если ваши значения SKU действительно будут иметь формат SKUNXXXXX, где XXXXX - это некоторое число, то вы можете просто добавить столбец автоматического увеличения и создать значение «на лету» при запросе на него. Таким образом, вы можете создать таблицу с именем products со следующими столбцами:

CREATE TABLE products 
(
    id INT(11) NOT NULL AUTO_INCREMENT, 
    name VARCHAR(55), 
    ... 
); 

Everytime вы делаете INSERT на products, то id столбец будет автоматически увеличиваться на MySQL. Если вы хотите, чтобы получить SKU, вы можете просто сделать запрос, как это:

SELECT id, name, CONCAT('SKUN', id) AS `SKU` 
FROM products 
WHERE name = 'someproduct' 

Если вы хотите, чтобы SKU номер не навсегда (т.е. когда присваивается определенный продукт, он может быть переведен в другое новый), то вы можете подумать об обновлении автоинкремента id столбец, qv this SO post для получения дополнительной информации.

Смежные вопросы