Создание запроса по умолчанию для столбца в таблице (SQL)? - PullRequest
0 голосов
/ 08 февраля 2010

У меня есть столбец в одной из моих таблиц, который, как предполагается, является общей суммой для строк ряда таблиц. Есть ли способ получить запрос по умолчанию, который выполняется для столбца общей суммы, чтобы при каждом добавлении строки в другую таблицу в столбце общей суммы производилось обновление.

Спасибо

Ответы [ 5 ]

2 голосов
/ 08 февраля 2010

Похоже, вы хотите добавить триггер.

http://dev.mysql.com/doc/refman/5.0/en/triggers.html

2 голосов
/ 08 февраля 2010

Для этого вы можете захотеть использовать представление вместо таблицы, может помочь что-то вроде следующего.

Select table.*, sum(otherTable.column) 
from table 
inner join otherTable on table.something = otherTable.something
1 голос
/ 08 февраля 2010

Как сказал Чарльз, триггер хорошо работает в этой ситуации. Однако если сумма строк в других таблицах часто меняется, я не уверен, что триггер вызовет проблемы с производительностью. Есть два других подхода:

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

Хранимая процедура. Если вы предпочитаете хранить столбец в главной таблице, вы можете регулярно запускать хранимую процедуру, которая обновляет информацию о сумме для всех строк.

1 голос
/ 08 февраля 2010

Вы хотите обновлять столбец общей суммы каждый раз, когда изменяется один из столбцов в других таблицах? Тогда триггер может служить вашим целям.

   Create Trigger For Insert, Update, Delete
   On OtherTable
   As
      Update SumTable Set
          SumColumn =
               (Select Sum(Column)
                From OtherTable
                Where something = s.Something)
      From SumTable s
      Where Something In
           (Select Distinct something From inserted
              Union
            Select Distinct Something From deleted)

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

   Create Trigger For Insert, Update, Delete
   On OtherTable
   As
      If Exists(Select * From inserted) And Update(Column)
          Update SumTable Set
              SumColumn =
                  (Select Sum(Column)
                   From OtherTable
                   Where something = s.Something)
          From SumTable 
          Where Something In 
              (Select Distinct Something 
               From Inserted)
      Else If Exists(Select * From deleted)              
          Update SumTable Set
              SumColumn =
                  (Select Sum(Column)
                   From OtherTable
                   Where something = s.Something)
          From SumTable 
          Where Something In 
              (Select Distinct Something 
               From deleted)
0 голосов
/ 08 февраля 2010

Я бы сравнил производительность между идеей представления и идеей триггера, прежде чем решить, какой из них использовать. Сделайте это с полным набором данных, который, как вы ожидаете, будет иметь представление, а не с небольшим тестовым набором данных. Не забудьте проиндексировать вид, если это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...