2013-09-17 2 views
0

У меня есть две таблицы, которые мне нужно обновить в базе данных. Я обновляю эти таблицы из данных в другой базе данных. Если запись в таблице 1 обновляется, мне нужно, чтобы старая информация в таблице 1 хранилась в таблице 2. Мне нужна логика, чтобы провести сравнение, а затем обновить таблицу 2, если это необходимо. Мой вопрос: какой лучший способ сделать это? Я думаю, что хранимая процедура была бы способ пойти, но я не уверен.Скопируйте данные в другую таблицу перед обновлением или вставкой. Использовать хранимую процедуру?

Вот более наглядное объяснение.

Table 1 
Student Grade 
james  6 
sarah  5 



    Table 2 
    EMPTY 

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

Other Database 
    Student  Grade 
    james  6 
    sarah  4 
    tom   7 

Вот некоторая неаккуратная логика, которая может помочь объяснить, что мне нужно делать.

--If records match do nothing 
IF otherDatabase.student = table1.student AND otherDatabase.grade = table1.grade THEN do nothing 

--If partial match copy old data to table 2 and insert new data to table1 
IF otherDatabase.student = table1.student AND otherDatabse.grade != table1.grade 
THEN copy table1.student to table2.student AND copy table1.grade to table2.grade THEN UPDATE table1.grade from otherDatabase.grade 

--If no match copy new data to Table1 
IF otherDatabase.student != table1.student AND otherDatabase.grade != table1.grade THEN INSERT otherDatabase.student AND otherDatabase.grade INTO table1 

В моем примере, Джеймс не получила бы потрогать, сара бы получить переехала в таблицу 2, а затем вставить в таблицу 1 с новым сортом и томом бы вставляется в таблицу 1.

Я очень сожалею если это не имеет смысла. Пожалуйста, позвольте мне уточнить, если необходимо. Спасибо

+0

Вы можете сделать это в одной таблице путем добавления нового столбца 'previous_grade' в таблице 1. Будет ли это быть подходящим решением? – Bohemian

+0

Это хорошее решение. Однако мой пример просто прост. Мне действительно нужно сравнить около 8 полей. Кроме того, таблица 1 находится в базе данных, из которой мне не разрешено добавлять или удалять столбцы. Спасибо –

ответ

1

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

С помощью хранимой процедуры я буду воспринимать вас с помощью курсора в таблице otherDatabase для чтения записей и сравнить их со значениями в таблице1, чтобы определить, должны ли данные таблицы 1 записываться в таблицу2, и если да, сделать это.

С триггера, я бы просто обновить данные в Table1 любыми средствами, не касаясь себя с тем, что перезапись данных, и в триггере,

использовать старые и новые значения, используя ## вставленных & ## Удаленные (системные) таблицы, чтобы определить, нужно ли записывать старые значения (## Deleted) в таблицу2. Например

INSERT Table2 (Student, Grade) 
SELECT d.Student, d.Grade 
FROM ##Deleted d LEFT JOIN ##Inserted i ON d.[Key] = i.[Key] 
WHERE (d.Student <> i.Student OR d.Grade <> i.Grade) AND d.[Key] IS NOT NULL 
+0

Могу ли я использовать метод триггера, если в таблице больше данных, чем то, что я купил из другой базы данных? Например, если это школа, имя, класс, возраст, дата рождения? Хотя я бы только сравнивал и обновлял имя и оценку? –

+0

Да. Всякий раз, когда вы обновляете строку в любой таблице, заполняются как ## Inserted & ## Deleted (с новыми и старыми значениями этой строки соответственно), поэтому, если вы обновили только два столбца, значения других столбцов в этой строке будут будут одинаковыми в обеих таблицах ## Inserted & ## Deleted, но обновленные столбцы будут соответственно отличаться. –

0
Drop procedure if exists getCID; 
delimiter // 
CREATE PROCEDURE getCID(IN cid varchar(100)) 
BEGIN 
    create table Temp as(select i.invoice_no,i.cust_id,b.tot_amount,b.paid_amount,b.bal_amount from invoice_item_info i,bill_info b where i.invoice_no=b.invoice_no and i.cust_id=cid); 
select * from Temp; 
select DISTINCT cust_id,count(invoice_no),sum(tot_amount),sum(paid_amount),sum(bal_amount) from Temp; 
Drop table Temp; 
END 
// 
delimiter ; 
Смежные вопросы