2010-08-25 7 views
0

Je suis relativement confus au sujet de cette ...champ de mise à jour MySQL sur insert si un autre champ (non clé) a changé

J'ai une table comme:


+----------------+--------------------------------------------------+------+-----+-------------------+-----------------------------+ 
| 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    |        | 
+----------------+--------------------------------------------------+------+-----+-------------------+-----------------------------+ 

Je viens d'ajouter le first_seen colonne. L'idée est que je vais utiliser INSERT ... SUR DUPLICATE KEY UPDATE. dhcp et ip sont à juste titre les clés primaires, comme je veux seulement avoir un enregistrement pour eux à la fois. Donc si mac change, il devrait mettre à jour la ligne existante s'il en existe une pour cette combinaison dhcp, ip.

cependant, je veux avoir first_seen mis à jour chaque fois une combinaison (ip, dhcp, mac) est vu ... à savoir si la valeur des changements « mac », je veux mettre à jour first_seen. Si la valeur de 'mac' reste la même, je veux laisser first_seen la même chose.

est-il un moyen simple de faire cela dans SQL ... à savoir un IF() ou quelque chose? ou dois-je gérer cela avec un autre SELECT dans le script PHP (en gardant à l'esprit que nous sommes en train d'analyser un fichier pour obtenir ces données, et en insérant environ 10-16k lignes, donc le temps est un facteur).

Merci, Jason

Répondre

0

Merci pour toutes les suggestions, les gars. Il s'avère que je n'ai pas besoin d'un déclencheur pour cela, juste un IF au début de l'instruction de mise à jour.

dans l'instruction INSERT INTO ... J'ai first_seen = CURRENT_TIMESTAMP

Puis au début de l'instruction UPDATE je

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

cela ne met à jour first_seen si les changements de mac, sinon il définit lui-même (first_seen à sa valeur actuelle).

0

Je pense que vous pouvez utiliser la colonne TIMESTAMP dans MySQL - cela va changer lorsque l'enregistrement est mis à jour ou inséré. Il changera quand n'importe quelle valeur dans la rangée change cependant. Si vous souhaitez que quelque chose d'autre se produise, vous pouvez envisager un trigger qui se déclenche après la mise à jour et valide l'autre logique métier que vous avez référencée.

1

Avez-vous pensé à utiliser triggers? C'est un événement MySQL côté serveur qui survient lorsqu'un autre événement, comme la mise à jour de la colonne mac, se produit.

Questions connexes