Поле автоинкремента, которое сбрасывается после изменения в другом поле - PullRequest
1 голос
/ 13 сентября 2011

Можете ли вы привести очень простой пример SQL, как создать поле "count" или "order", которое будет автоматически увеличиваться, но перезапускается после каждого изменения в другом поле? В приведенной ниже таблице поле «Порядок» будет перезапускаться с «1» каждый раз, когда в поле «Питание» вносятся изменения. Спасибо.

Заказ еды
Обед 10:30 1
Обед 11:00 2
Обед 11:15 3
Ужин 4:30 1
Ужин 4:45 2
Ужин 5:00 3
Ужин 5:30 4

Ответы [ 2 ]

4 голосов
/ 13 сентября 2011

Вместо сохранения Order в таблице рассмотрите возможность добавления его в представление.Вы можете выбрать из представления вместо таблицы, когда вам это нужно.

Представление может использовать row_number() для расчета заказа, например:

select  row_number() over (partition by Meal order by Time)
,       *
from    YourTable

Пример в SEДанные.

1 голос
/ 13 сентября 2011

Это не то, что вы должны хранить в базе данных.Вы в основном храните одну и ту же информацию дважды (в данном случае она является производной, но фактически одинаковой), что, вероятно, приведет к проблемам в будущем.Вы получите новую строку Обеда перед последней, и номера заказов будут испорчены и т. Д. Вместо этого просто рассчитайте номер, когда он вам нужен.

Вы не упоминаете, какойСУБД, которую вы используете (всегда полезно включать эту информацию при задании вопроса), но что-то вроде следующего будет работать с SQL Server и другими СУБД, которые поддерживают функции раздела:

SELECT
    meal,
    [time],  -- I'd pick a better column name myself. Reserved words = evil
    ROW_NUMBER() OVER(PARTITION BY meal ORDER BY time) AS [order]  -- Another reserved word! Eeek!
FROM
    My_Table
...