Подтвердить что ты не робот

Увеличиваемое значение 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:)

4b9b3361

Ответ 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'";