MySQL - вторая последовательность в таблице (например, по категориям) - PullRequest
0 голосов
/ 12 октября 2009

Я пытаюсь найти наиболее эффективный способ что-то сделать и буду признателен за ваш совет!

У меня есть таблица со следующими столбцами:

id
category
category_sequence
other_columns

id - это столбец с автоинкрементом и первичный ключ. Категория выбирается пользователем в пользовательском интерфейсе.

Что я хотел бы сделать, это сгенерировать category_sequence, которая является самой высокой из существующих категорий_последовательностей для этой категории + 1.

Например, вставка нескольких строк будет выглядеть так:

  • 1, 1, 1
  • 2, 1, 2
  • 3, 2, 1
  • 4, 1, 3

и т. Д.

Очевидно, что я мог бы выполнить запрос, чтобы извлечь самую высокую последовательность category_sequence, добавить один к нему, а затем запустить мой оператор вставки. Но есть ли гораздо более эффективный способ (некоторые из вставок будут иметь довольно большие петли, так что все, что ускорит его и предотвратит кроссовер, будет замечательно).

Заранее спасибо, Кев

Ответы [ 3 ]

1 голос
/ 12 октября 2009

вы можете попробовать

    insert into mytable
    select "categoryselected",coalesce(max(category_sequence),0)+1 from mytable where category = "categoryselected"

Возможно, вам придется заключить его в инструкцию case, если это первая запись в этой категории. У меня нет mysql для тестирования на

0 голосов
/ 12 октября 2009

Вы можете сделать так, чтобы база данных сделала это, изменив поле auto_increment на category_sequence, а затем установите первичный ключ в категорию category_sequence Затем вы можете удалить поле id, поскольку оно не будет выполнять то, что вы хотели. Затем MySql будет увеличивать поле category_sequence точно так, как вы его описали.

0 голосов
/ 12 октября 2009

Если у вас есть таблица "Category", к которой относится категория, у вас может быть поле next_sequence. Затем создайте в таблице триггер вставки, который вытягивает следующий порядковый номер, помещает его в столбец category_sequence и увеличивает поле next_sequence (все должно быть сделано в одной транзакции).

...