2012-04-21 52 views
0

我已經讀完了這一點:是否可以插入一行,但只有當值已更改?

How do I insert into a database only if a value has changed?

所以我的問題是非常密切的,但它不是exaclty相同。

我有4個 「主要」 列(即我有我的所有表的4相同的列)的表:

  • id - INT - AUTOINC
  • id_origin - INT - ID,當第一記錄的創建
  • date_v_start - 日期時間 - 啓動記錄
  • date_v_end的有效日期 - 日期時間 - 記錄的有效期結束(如果NULL這是當前「有效」的記錄)

下面是特定於該表中的某些其他領域: - summary - 文本 - detail - 文本

知道這一點,當我有一些已被改變成表,這是我做的:

  • 我更新當前記錄的date_v_end爲 「NOW()」
  • 我插入一個新的記錄,與date_v_start =以前的 = date_v_end = NULL和(當然)新值summarydetail

我的問題是,如果summarydetail值都沒有改變,我不希望插入新的記錄,這是浪費時間和硬盤驅動器的空間。

有沒有一種方法(如果可能的話在一杆)做這樣的事情:

「如果summary<>'a value' or detail<>'another value' then update this record and insert this new one

所以,我的問題,我上面提供的鏈接之間的區別是: - 有超過一個字段比較 - 有兩個請求 - 我想使它在如果請求可能。

+0

您可以在應用程序中編寫邏輯,使用存儲過程或使用觸發器。哪些是可以的? – Jon 2012-04-21 19:07:08

+0

可能使用觸發器,或使用存儲過程。如果可能的話,我希望兼容'mysql'和'postgresql' – 2012-04-21 19:08:22

回答

0

以下是我在一個「PHP查詢」 =一個字符串中間的逗號做到了(這是非常耗時的,但我會改變它如果有一天我的web服務器不能處理它了):

CREATE TEMPORARY TABLE tmp 
SELECT * FROM table 
WHERE id=:id; 
ALTER TABLE tmp drop ID; 
INSERT INTO table 
SELECT 0,tmp.* FROM tmp; 
DROP TABLE tmp: 
UPDATE table 
SET date_v_fin=NOW() 
WHERE id=LAST_INSERT_ID(); 
相關問題