如果其他字段(非密钥)发生更改,则插入MySQL更新字段

时间:2010-08-25 13:43:25

标签: mysql

我对此感到比较困惑......

我有一张表:


+----------------+--------------------------------------------------+------+-----+-------------------+-----------------------------+
| Field          | Type                                             | Null | Key | Default           | Extra                       |
+----------------+--------------------------------------------------+------+-----+-------------------+-----------------------------+
| dhcp           | int(10) unsigned                                 | NO   | PRI | 0                 |                             |
| ip             | int(10) unsigned                                 | NO   | PRI | 0                 |                             |
| mac            | varchar(17)                                      | YES  | MUL | NULL              |                             |
| lease          | enum('fr','a','fi','a','u') | NO   | MUL | free) |                                |                             |
| date           | timestamp                                        | NO   | MUL | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| uid            | varchar(255)                                     | YES  |     | NULL              |                             |
| starts_date    | datetime                                         | YES  |     | NULL              |                             |
| starts_weekday | tinyint(1)                                       | YES  |     | NULL              |                             |
| ends_date      | datetime                                         | YES  |     | NULL              |                             |
| ends_weekday   | tinyint(1)                                       | YES  |     | NULL              |                             |
| first_seen     | datetime                                         | YES  |     | NULL              |                             |
+----------------+--------------------------------------------------+------+-----+-------------------+-----------------------------+

我刚刚添加了first_seen列。我的想法是我将使用INSERT ... ON DUPLICATE KEY UPDATE。 dhcpip是正确的主键,因为我希望一次只有一条记录。因此,如果mac发生更改,则应该更新现有行(如果存在该dhcp,ip组合的行。)

然而,我希望每次看到(ip,dhcp,mac)组合时都更新first_seen ...即如果'mac'的值发生变化,我想更新first_seen。如果'mac'的值保持不变,我想让first_seen保持不变。

有没有简单的方法在SQL中执行此操作...即IF()或其他什么?或者我必须使用PHP脚本中的另一个SELECT处理此问题(请记住,我们正在解析文件以获取此数据,并插入10-16k行,因此时间是一个因素)。

谢谢, 杰森

4 个答案:

答案 0 :(得分:1)

您是否考虑过使用triggers?这是一个MySQL服务器端事件发生在其他事件发生时,例如更新mac列。

答案 1 :(得分:0)

我想你可能想在MySQL中使用TIMESTAMP列 - 这会在更新或插入记录时发生变化。但是,当行中的任何值发生变化时,它将发生变化。如果您想要其他事情发生,您可能会考虑更新后触发的trigger并验证您引用的其他业务逻辑。

答案 2 :(得分:0)

您可以使用MySQL trigger进行此操作。

答案 3 :(得分:0)

感谢所有的建议,伙计们。事实证明,我不需要触发器,只需要在更新语句开头的IF。

INSERT INTO中的

...我有first_seen = CURRENT_TIMESTAMP

然后在UPDATE的开头我

first_seen = IF(mac!= VAULES(MAC),CURRENT_TIMESTAMP,first_seen)

如果mac更改,则仅更新first_seen,否则将first_seen设置为自身(其当前值)。