2010-08-25 2 views
0

Я относительно запутался об этом ...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. dhcp и ip являются правыми первичными ключами, так как я хочу иметь только одну запись для них за раз. Поэтому, если изменяется mac, он должен обновить существующую строку, если она существует для этой комбинации dhcp, ip.

однако, я хочу иметь first_seen обновляется каждый раз, когда (IP, DHCP, макинтош) сочетание видно ... то есть, если значение изменения «МКВ», я хочу, чтобы обновить first_seen. Если значение «mac» остается неизменным, я хочу оставить first_seen тем же.

Есть ли простой способ сделать это в SQL ... например, IF() или что-то еще? или я должен обрабатывать это с помощью другого SELECT в скрипте PHP (имея в виду, что мы разбираем файл для получения этих данных и вставляем строки abub 10-16k, поэтому время является фактором).

Спасибо, Джейсон

ответ

0

Спасибо за все предложения, ребята. Оказывается, мне не нужен триггер для этого, просто IF в начале оператора обновления.

в INSERT INTO ... Я first_seen = CURRENT_TIMESTAMP

Тогда в начале UPDATE У меня есть

first_seen = IF (макинтош! = Воулс (MAC), CURRENT_TIMESTAMP, first_seen)

Это обновление обновляется first_seen, если изменяется mac, иначе он устанавливает first_seen для себя (его текущее значение).

0

Я думаю, что вы можете использовать TIMESTAMP колонку в MySQL - это изменится, когда запись обновляется или вставлена. Он изменится, если любое значение в строке изменится. Если вам нужно что-то еще, вы можете подумать о trigger, который запускается после обновления и проверяет другую бизнес-логику, на которую вы ссылались.

1

Считаете ли вы использование triggers? Это событие на стороне сервера MySQL происходит, когда происходит какое-то другое событие, такое как обновление столбца mac.

Смежные вопросы