Я как бы новичок в этом, но хочу написать первый простой триггер. Если у меня есть таблица с полями A, B, C. Когда пользователь вставляет или обновляет A и B, я хочу обновить C = A + B с помощью триггера , было бы легко? спасибоОбновление/вставка триггера в той же таблице
ответ
Вот триггер, который будет делать, как вы просите. Поскольку в моей таблице отсутствует столбец идентификатора, нет способа указать только обновление c для обновленных строк (то есть значение c
будет пересчитано для каждой строки для каждой вставки/обновления).
CREATE TRIGGER mytrigger
ON mytable
FOR INSERT, UPDATE
AS
UPDATE mytable
SET c = COALESCE(a, 0) + COALESCE(b, 0)
Это было бы подходящим кандидатом для вычисляемого столбца:
CREATE TABLE mytable
(
a INT,
b INT,
c AS COALESCE(a, 0) + COALESCE(b, 0)
)
Редактировать: Пример с идентификатором столбца, чтобы обновить только c
обновленных/вставленных строк:
CREATE TRIGGER mytrigger
ON mytable
FOR INSERT, UPDATE
AS
UPDATE mytable
SET c = COALESCE(a, 0) + COALESCE(b, 0)
WHERE ID IN (SELECT ID
FROM inserted)
Я создал SQL Fiddle, где вы можете видеть это в прямом эфире.
Для запуска вам пример SQL Скрипки:
- Создать схему, добавить некоторые выборочные данные, а затем добавить определение триггера (так
c
является безлюдной в этот момент). - Выберите из таблицы, чтобы вы могли видеть значения примера.
- Обновить строку, а затем снова выбрать таблицу (вы можете увидеть
c
). - Вставьте новую строку, затем снова выберите все из таблицы (
c
был заселен для этой новой строки).
Чтобы объяснить немного больше о том, как это работает - во время выполнения триггера, SQL-сервер (я предполагаю теперь, что это то, что вы используете) создает две временные таблицы inserted
и deleted
копии затронутых строк in - мы можем присоединиться или выбрать из этих таблиц, если нам нужно получить данные от них; в этом случае просто получить список идентификаторов, которые были затронуты операцией update/insert, а затем только обновление c
для этих строк. Подробнее об этом см. В разделе this MSDN article.
Этот триггер обновлял каждую строку каждый раз, когда что-либо обновлялось. Это связано с проблемой производительности. Вычисленный столбец в любом случае является правильным выбором (вы, возможно, захотите, чтобы он сохранялся хотя бы на SQL Server). – HLGEM
@HLGEM Да, я знаю, я уже упоминал об этом в своем ответе - я предполагаю, что это учебное упражнение, и ОП просто хотел знать, как это можно сделать. Я знаю, что с правильным столбцом идентификатора вы можете присоединиться к таблице «вставлен» в триггере, чтобы обновлять только соответствующие строки, но такой столб не упоминался в схеме примера. Хороший вопрос о 'persisted', но OP все еще не ответил на вопрос о том, какие СУБД они используют! ;-) – Bridge
Спасибо. Это более сложное вычисление. Сначала я пытаюсь изучить концепцию (MS SQL 2008). Это база данных программного обеспечения ERP, поэтому мы не контролируем структуру. Я просто хочу, чтобы это поле C вычислялось и не было уверенным, как работает этот триггер.Да, я должен был упомянуть ID col. Если это действие обновления, где я могу найти совпадение a & b? в моей таблице? мне нужно «выбрать» в вставленном, если он вставлен?
CREATE TRIGGER MyTrigger ПО туЬаЫм для вставки КАК UPDATE туЬаЫе SET, с = СОАЬЕЗСОМ (выбрать из вставлено I, где i.id = ID, 0) + СОАЬЕЗС (выбрать б от вставленного I, где i.id = Id, 0) –
HoangMN
- 1. mysql trigger в той же таблице
- 2. Выбор триггера из той же таблицы
- 3. FK в той же таблице
- 4. ManyToMany в той же таблице
- 5. группа по той же таблице
- 6. Ключ в той же таблице в postgres?
- 7. ВЫБРАТЬ в UPDATE в той же таблице
- 8. Mysql родитель ребенка в той же таблице
- 9. MySQL Условное обновление в той же таблице
- 10. SQL-подзапрос в той же таблице
- 11. Перетаскивание из таблицы в той же таблице
- 12. Вставка и обновление в той же таблице
- 13. Отношения в SQL по той же таблице
- 14. Mysql запрос выбрать в той же таблице
- 15. MySQL выберите в той же таблице
- 16. MySQL - рассчитывать в той же таблице
- 17. Как подсчитать крест в той же таблице?
- 18. Отображение противоположных результатов в той же таблице
- 19. Как обновить поле в той же таблице
- 20. Присоединяйтесь к полям в той же таблице
- 21. MySQL - выберите в той же таблице
- 22. соединения и вставки в той же таблице
- 23. SQL множественные соединения в той же таблице
- 24. подзапрос mysql в той же таблице
- 25. MySQL поворота в той же таблице
- 26. Обновление MySQL TRIGGER в той же таблице
- 27. Сравнить данные в той же таблице
- 28. Индексы для ссылок в той же таблице
- 29. Оператор удаления в той же таблице
- 30. Сравнение данных в той же таблице - SQL
какая база данных вы используете? –
Не используйте для этого триггер. Вы всегда можете получить эту сумму при выборе. Вы хотите рассмотреть мнение для удобства. В общем: никогда не сохраняйте значения в базе данных, которые могут быть получены из существующих значений. –