2012-04-21 49 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(); 
相关问题