2009-12-28 21 views
2

Vous cherchez déjà un moment pour savoir comment accomplir cela.mysql insert si la ligne n'existe pas déjà dans une table avec AUCUN CHAMPS UNIQUES

Il semble que toutes les solutions nécessitent des champs uniques avec des index.

+0

Je ne pense pas que cela fonctionne sans champs unique ... Je veux dire, quel état voulez-vous utiliser? – Bobby

+0

Glenn, sans un index unique, il n'y a aucun moyen de dire s'il y a une colonne en double qui nécessiterait un UPDATE. Montrez-nous votre structure de table et dites-nous quels champs vous voulez déclencher la clause UPDATE et nous pouvons vous donner une réponse. –

Répondre

0

Avez-vous déjà considéré la syntaxe INSERT OR UPDATE de mysql, ou voulez-vous que l'insertion la plus récente soit annulée au lieu de revenir à une mise à jour? Editer: après réflexion, la syntaxe exacte, telle qu'affichée par afftee, de ON DUPLICATE KEY est uniquement déclenchée par une valeur dupliquée sur la clé primaire ou au moins sur des colonnes uniques.

serait une solution possible d'utiliser un déclencheur BEFORE INSERT semblable à ceci:

CREATE TRIGGER block_dup_insert BEFORE INSERT ON my_table 
FOR EACH ROW BEGIN 
    -- check condition and stop if it would be duplicated according to your logic 
END 

Si vous voulez arrêter la gâchette et empêcher l'insertion réelle, il semble que vous pouvez utiliser ce poste de Nicolas Lescure trouvé sur [mysql doc] [1]:

une autre façon de "STOP ACTION" est de créer une table (stop_action) avec juste une clé primaire (reason_to_stop). Puis vous pré-remplir cette table avec du texte ('ne faites pas cela', 'ou' soit ') => pour arrêter l'action, il suffit de faire un insert dans cette table (stop_action) avec l'un des le pré -filled value ('ne faites pas cela').

[1]: http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html mysql créer la documentation de déclenchement

9

il n'y a pas SINON EXISTE syntaxe dans INSERT, mais vous pouvez utiliser le Duplicate mécanisme clé. En supposant que vous créez un index unique sur nom, prénom, votre mise à jour peut lire:

INSERT INTO tb (firstname, lastname) 
VALUES ('Jack', 'Doe') 
ON DUPLICATE KEY UPDATE lastname = lastname; 

qui rend l'insert neutre.

+0

Ne fonctionne que pour les champs uniques –

+0

HEURES DE RECHERCHE .. VOUS AVEZ FAIT MON JOUR :) –

-1

Il n'y a pas de syntaxe 'insert if not exists' dans la documentation d'insertion Mysql. Pour éviter ce problème, je préconise d'utiliser la syntaxe "Insert ... select". Dans la partie select, vous devez ajouter une instruction where en utilisant la syntaxe "not exists". Par exemple, vous pouvez utiliser ceci:

insert into tbl (firstname,lastname) select 'Jhon', 'Doe' 
from tbl where not exists (select 1 from tbl where firstname = 'Jhon' and lastname = 'Doe') limit 1; 
+0

Ne fonctionne pas parce que si la ligne n'existe pas, alors vous n'obtiendrez aucun résultat de la sélection 'Jhon', 'Doe' de tbl et donc aucune ligne ne sera insérée si la ligne n'existe pas –

0
$sql2="INSERT INTO site_shipping (ship_oid,ship_status) 
     SELECT '$orderid', '$status' 
     FROM site_shipping 
     WHERE NOT EXISTS 
      (SELECT * 
      FROM site_shipping 
      WHERE ship_oid = '$orderid' 
     ) 
     LIMIT 1 
     ";