2010-04-27 4 views
4

J'ai un script qui capture les tweets et les met dans une base de données. Je vais exécuter le script sur un cronjob et ensuite afficher les tweets sur mon site à partir de la base de données pour éviter d'atteindre la limite de l'API Twitter. Donc, je ne veux pas avoir de tweets en double dans ma base de données, je comprends que je peux utiliser 'INSERT ... ON DUPLICATE KEY UPDATE' pour y parvenir, mais je ne comprends pas très bien comment l'utiliser.Comment utiliser SQL - INSERT ... ON DUPLICATE KEY UPDATE?

Ma structure de base de données est la suivante.

Tableau - Hash id (auto_increment) Tweet utilisateur user_url

Et actuellement mon SQL pour insérer est la suivante:

$tweet = $clean_content[0]; 
$user_url = $clean_uri[0]; 
$user = $clean_name[0]; 

$query='INSERT INTO hash (tweet, user, user_url) VALUES ("'.$tweet.'", "'.$user.'", "'.$user_url.'")'; 
mysql_query($query); 

Comment puis-je utiliser correctement « INSERT ... ON DUPLICATE KEY UPDATE 'à insérer seulement s'il n'existe pas, et mettre à jour si c'est le cas?

Merci

+0

http: // dev .mysql.com/doc/refman/5.0/fr/insert-on-duplicate.html –

+0

Vous avez besoin d'un "champ unique" dans la liste des champs à insérer. Si 'tweet',' user' et 'user_url' sont des champs normaux (c'est-à-dire qu'ils ne sont pas' uniques'), cela ne fonctionnera pas. – binaryLV

Répondre

5

vous avez besoin d'une clé UNIQUE sur votre table, si user_url est tweer_url, alors cela devrait correspondre (chaque tweet a une URL unique, id serait mieux).

CREATE TABLE `hash` (
    `user_url` ..., 
    ..., 
    UNIQUE KEY `user_url` (`user_url`) 
); 

et son mieux d'utiliser INSERT IGNORE sur votre cas

$query='INSERT IGNORE INTO hash (tweet, user, user_url) VALUES ("'.$tweet.'", "'.$user.'", "'.$user_url.'")'; 

Duplicate KEY est utile lorsque vous avez besoin de mettre à jour la ligne existante, mais que vous souhaitez insérer une fois

+0

Merci pour votre réponse, cela semble fonctionner pour moi. Bien que je pense que je vais utiliser l'ID de l'article twitter plutôt que l'URL, je suppose que l'ID est le numéro à 11 chiffres, par exemple - 12935503743 – Probocop

0

Essayez d'utiliser:

$query='INSERT INTO hash (tweet, user, user_url) 
     VALUES ("'.$tweet.'", "'.$user.'", "'.$user_url.'") 
     ON DUPLICATE KEY UPDATE tweet = VALUES(tweet)'; 
0

Duplicate KEY UPDATE ne semble pas être la bonne solution ici, que vous ne voulez pas mettre à jour si la valeur est déjà dans la table .

J'utiliserais le champ unique d'identifiant de statut de Twitter (qui devrait être unique pour chaque tweet) au lieu de votre identifiant de hachage. Ajoutez-le en tant que champ sur votre table et définissez-le en tant que clé primaire (ou en tant qu'index unique.) Utilisez ensuite REPLACE INTO, y compris l'ID d'état de Twitter. Cela a l'avantage que vous pouvez toujours suivre votre enregistrement vers un Tweet unique sur twitter, de sorte que vous pourriez facilement obtenir plus d'informations sur le Tweet plus tard si vous en avez besoin.

Questions connexes