Я относительно запутался в этом...
У меня есть таблица вроде:
+----------------+--------------------------------------------------+------+-----+-------------------+-----------------------------+
| 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.
однако, я хочу, чтобы first_seen обновлялся каждый раз, когда видна комбинация (ip, dhcp, mac)... т.е. если изменяется значение "mac", я хочу обновить first_seen. Если значение "mac" остается неизменным, я хочу оставить first_seen тем же.
Есть ли простой способ сделать это в SQL... то есть IF() или что-то еще? или мне нужно обрабатывать это с помощью другого SELECT в PHP script (имея в виду, что мы разбираем файл для получения этих данных и вставляем строки abub 10-16k, поэтому время является фактором).
Спасибо, Джейсон
Спасибо за все предложения, ребята. Оказывается, мне не нужен триггер для этого, просто IF в начале оператора обновления.
в INSERT INTO... У меня есть first_seen = CURRENT_TIMESTAMP
Тогда в начале ОБНОВЛЕНИЯ у меня есть
first_seen = IF (mac!= VAULES (MAC), CURRENT_TIMESTAMP, first_seen)
Это обновляет first_seen, если изменяется mac, иначе он устанавливает first_seen для себя (его текущее значение).
Считаете ли вы использование triggers? Это событие на стороне сервера MySQL происходит, когда происходит какое-то другое событие, такое как обновление столбца mac.
Для этого можно использовать для запуска MySQL.
Я думаю, вы можете использовать колонку TIMESTAMP в MySQL - это изменится, когда запись обновляется или вставляется. Он изменится, если любое значение в строке изменится. Если вам нужно что-то еще, вы можете рассмотреть trigger, который запускается после обновления и проверяет другую бизнес-логику вы ссылаетесь.