我对此感到比较困惑......
我有一张表:
+----------------+--------------------------------------------------+------+-----+-------------------+-----------------------------+
| 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。 dhcp
和ip
是正确的主键,因为我希望一次只有一条记录。因此,如果mac
发生更改,则应该更新现有行(如果存在该dhcp,ip组合的行。)
然而,我希望每次看到(ip,dhcp,mac)组合时都更新first_seen ...即如果'mac'的值发生变化,我想更新first_seen。如果'mac'的值保持不变,我想让first_seen保持不变。
有没有简单的方法在SQL中执行此操作...即IF()或其他什么?或者我必须使用PHP脚本中的另一个SELECT处理此问题(请记住,我们正在解析文件以获取此数据,并插入10-16k行,因此时间是一个因素)。
谢谢, 杰森
答案 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设置为自身(其当前值)。