#mysql #sql #django
#mysql #sql #джанго
Вопрос:
Я изучаю бэкэнд-разработку в Django и столкнулся с этой проблемой.
Допустим, я разрабатываю приложение для путешествий: у меня есть две базы данных USER и TRIP с отношением «один ко многим». т. Е. У каждого пользователя может быть несколько поездок, и каждая поездка может быть предпринята только одним пользователем.
У ПОЕЗДКИ есть столбец trip-number. Я хотел бы автоматически увеличивать этот столбец для каждой строки, добавленной в базу данных TRIP, НО приращение должно быть независимым для каждого пользователя, начиная с 1
Таблица ОТКЛЮЧЕНИЯ
пользователь | номер поездки |
---|---|
1 | 1 |
2 | 1 |
1 | 2 |
1 | 3 |
2 | 2 |
3 | 1 |
Что-то в этом роде? Я не могу автоматически увеличивать весь столбец, так как он должен быть уникальным для каждой поездки, совершаемой пользователем, НО цифры могут быть одинаковыми у разных пользователей.
В идеале я предпочитаю делать это автоматически на стороне сервера (sql) вместо того, чтобы писать логику в клиенте. Любая помощь будет признательна. Спасибо
Комментарии:
1. Вы можете создать для него триггер при вставке / удалении, найти максимальное число для каждого пользователя и добавить к нему единицу для вновь добавленной записи. Но я бы не советовал использовать trigger. Вместо этого вы можете создать одно представление, в котором будет один дополнительный столбец для trip_number ..
2. Это то, что я делаю прямо сейчас. Для каждой вставки я фильтрую и получаю количество поездок для пользователя и увеличиваю его. Но я хотел посмотреть, есть ли лучший способ сделать это, а также я не упускаю ничего очевидного. Что вы подразумеваете под второй частью вашего заявления? В этой таблице есть другие столбцы, такие как source, destination и т.д., Выделение одного столбца trip_number и выделение его в отдельную таблицу не имеет никакого значения, связанного с ним, верно?
3. Не делайте этого. Просто сохраните AI.
Ответ №1:
Использование trigger
для обновления trip_num
столбца — один из способов достижения желаемого результата, но я бы посоветовал не использовать triggers
, поскольку у него много недостатков. Некоторые из них следующие:
- вам понадобится триггер для действий вставки / удаления / обновления.
- В
insert trigger
вам нужно будет назначитьtrip_number
для каждого пользователя. - В
update trigger
, вам нужно будет проверить, обновлен ли пользовательский столбец, если да, то вам нужно будетtrip_number
соответствующим образом организовать. - Кроме
delete trigger
того, вам придется упорядочить всеtrip_num
, если одна из записей, кроме последней записи пользователя, будет удалена. - Если две транзакции происходят одновременно для одного и того же пользователя, то есть вероятность, что триггеры назначают одинаковые
trip_num
значения для разных строк одного и того же пользователя.
Итак, чтобы избежать этого, вы можете использовать view
следующее:
Create view vw_name as
Select t.*, -- use column names and remove trip_num column
Row_number() over (partition by user order by trip_date) as trip_num
From your_table t