Увеличиваемое значение MySQL
Есть ли способ сделать приращение значения с каждой вставкой, если у вас есть несколько вставок? (Я не говорю о первичном ключе, что автоинкремент)
Предположим, что у меня есть такая структура:
|ID_PRODUCT|ID_CATEGORY|NAME|POSITION|
Итак, у меня есть отдельные идентификаторы продуктов, каждый из которых относится к категории и имеет другую позицию в этой категории. Я хочу сделать что-то вроде этого:
INSERT INTO products
( SELECT id_product, id_category, name, MY_POSITION++
FROM db2.products WHERE id_category = xxx )
Таким образом, должна существовать переменная MY_POSITION, которая начинается с 1 и увеличивает каждую вставку.
Было бы очень просто сделать это всего лишь с помощью скриптового языка, такого как php или python, но я хочу поправиться с SQL:)
Ответы
Ответ 1
Да: используйте пользовательскую переменную:
SET @position := 0; -- Define a variable
INSERT INTO products
SELECT id_product, id_category, name, (@position := @position + 1)
FROM db2.products
WHERE id_category = xxx;
Результат приращения до @position
- это значение, используемое для вставки.
Edit:
Вы можете пропустить объявление переменной путем обработки начального значения в строке:
...
SELECT ..., (@position := ifnull(@position, 0) + 1)
...
Это может быть особенно удобно при выполнении запроса с использованием драйвера, который не допускает нескольких команд (разделенных точкой с запятой).
Ответ 2
Вам нужно указать ORDER BY id_category и использовать две пользовательские переменные, чтобы вы могли отслеживать идентификатор предыдущей категории -
SET @position := 0;
SET @prev_cat := 0;
INSERT INTO products
SELECT id_product, id_category, name, position
FROM (
SELECT
id_product,
id_category,
name,
IF(@prev_cat = id_category, @position := @position + 1, @position := 1) AS position,
@prev_cat := id_category
FROM db2.products
ORDER BY id_category ASC, id_product ASC
) AS tmp;
Это позволит вам делать все категории в одном запросе вместо категории по категориям.
Ответ 3
Попробуйте установить значение с помощью подзапроса, подобного этому
(SELECT MAX(position) FROM products AS T2)+1
Или
(SELECT MAX(position) FROM products AS T2 WHERE id_category = 'product category')+1
Ответ 4
Чисто добавить к ответу @Bohemians - я хотел, чтобы счетчик был reset каждый так часто, и это можно сделать следующим образом:
SELECT *,(@position := IF (@position >= 15,1,@position + 1))
Где 15, очевидно, максимальное число до reset.
Ответ 5
Надеюсь, что это сработает.
update <tbl_name> set <column_name>=<column_name>+1 where <unique_column/s>='1'";