Поле автоинкремента, которое сбрасывается после изменения в другом поле

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

Порядок приема пищи
Обед 10:30 1
Обед 11:00 2
Обед 11:15 3
Ужин 4:30 1
Ужин 4:45 2
Ужин 5:00 3
Ужин 5:30 4


person Nick    schedule 13.09.2011    source источник


Ответы (2)


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

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

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

Пример в SE Data.

person Andomar    schedule 13.09.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
person Tom H    schedule 13.09.2011
comment
Почему бы не назвать таблицу [Table] ? хе-хе - person Andomar; 14.09.2011
comment
Спасибо. Я использую MS SQL в ASP.NET. И не волнуйтесь, настоящие имена полей будут InTime и ShiftOrder. - person Nick; 14.09.2011