[SQL] insert avec conditions

insert avec conditions [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 31-10-2006 à 10:46:44    

Salut,
Comment fait-on une insertion avec une condition dans MS SQL?  
Exemple :
J'ai la table suivante :

personne (nom, age )
"Jaque Dubois", 20
"Patrick Dupond", 18
"Pierre Leclerc", 16
"Olivier Dupuis", 19


Et je souhaite ajouter les valeurs suivantes :

"Patrick Dupond", 18
"Julie Durand", 19
"Stéphanie Conti", 21


Pour obtenir le résultat suivant :

"Jaque Dubois", 20
"Patrick Dupond", 18
"Pierre Leclerc", 16
"Olivier Dupuis", 19
"Julie Durand", 19
"Stéphanie Conti", 21


 
Pour l'instant j'ai :

INSERT INTO personne(nom,age)
VALUES ('Patrick Dupond', 18), ('Julie Durand', 19), ('Stéphanie Conti', 21);


Mais "Patrick Dupond" existe déjà dans la table personne. Je ne veux pas l'ajouter en double. Est-ce que cela se formule sous la forme d'une condition WHERE dans le INSERT ?
 
Merci :)

Reply

Marsh Posté le 31-10-2006 à 10:46:44   

Reply

Marsh Posté le 31-10-2006 à 11:40:55    

bien sur :) Par exemple :
 
WHERE nom NOT IN (SELECT nom FROM personne)


---------------
I drive at 88mph ! Just in case...
Reply

Marsh Posté le 31-10-2006 à 12:06:55    

merci pour ta réponse :)
 
en faite je suis confronté à un autre problème... l'insertion multiple avec MSQSL 6.5
 
J'ai essayé ça :

INSERT INTO personne (nom, age)
VALUES ('Toto', 18), ('Titi', 20), ('Tata', 16)


Mais il n'aime pas le "," intermédiaire. J'ai donc essayé ça :

INSERT INTO personne (nom, age)
VALUES ('Toto', 18)
VALUES ('Titi', 20)
VALUES ('Tata', 16)


Mais il n'aime pas le second "VALUES". J'ai trouvé une asstuce sur le net :

INSERT INTO personne (nom, age)
SELECT 'Toto', 18
UNION ALL
SELECT 'Titi', 20
UNION ALL
SELECT 'Tata', 16


Mais il n'aime pas ça non plus.
 
Comment fait-on une insertion multiple sans effectuer autant de requête insert qu'il y à de valeurs à insérer  :??:

Reply

Marsh Posté le 31-10-2006 à 12:35:14    

tu fais un insert "normal", et t'auras plus de problème :o
 
arrêtez de toujours vouloir utiliser des trucs que seul mysql supporte :o
 
sinon, faire proprement, et faire un trigger "before insert", qui fait un update quand la ligne existe déjà.


Message édité par MagicBuzz le 31-10-2006 à 12:35:48
Reply

Marsh Posté le 31-10-2006 à 12:37:46    

Genre, si au lieu d'insérer  
"Patrick Dupond", 18  
Tu insères
"Patrick Dupond", 19 (bein ouais, au bout d'un an, il a un an de plus :D)
 
Avec le where proposé par chapi, ça mettra rien à jour.
avec un trigger, si.
 
ps: qu'est-ce que tu fous avec MS SQL Server 6.5 ? Tu sais quand même qu'il date de 1994 ? :o
 
Déjà le 7.0 c'est vraiment déterrer les morts, mais alors le 6.5... déjà en 1999 quand j'ai commencé à bosser, il n'était plus utilisé :D

Reply

Marsh Posté le 31-10-2006 à 14:16:34    

Pour ce qui est d'utiliser la version 6.5 de MS SQL, je n'y peux rien, c'est imposé...
 
Retirer le INTO ne change rien, je n'arrive pas à faire une insertion multiple en une commande. Je suis obligé de faire :

INSERT personne (nom, age) VALUES ('Toto', 18)  
INSERT personne (nom, age) VALUES ('Titi', 20)  
INSERT personne (nom, age) VALUES ('Tata', 16)
...


En ce qui concerne le besoin de ne pas insérer de doublon, finalement j'utilise nom comme clé et l'insertion d'un doublon est refusée automatiquement.
 
Sinon, merci pour l'astuce du trigger. Ca ne va pas me servir dans ce cas concret mais c'est bon à savoir (je ne suis pas un pro en SQL...).
 
PS : pour mon exemple j'ai simplifié la structure et le nom des champs. Dans mon cas, l'"age" n'ai pas amené à évoluer... ;)

Reply

Marsh Posté le 31-10-2006 à 14:23:49    

je t'ai dit d'utiliser u insert normal, pas d'enlever le into :o
 
nan, tu fais :
 

Code :
  1. insert into tambouille (truc, muche) values ('machin1', 'chose1')
  2. go
  3. insert into tambouille (truc, muche) values ('machin2', 'chose2')
  4. go

Reply

Marsh Posté le 31-10-2006 à 14:25:41    

sinon, juste par curiosité, qui vous impose la 6.5 ? son père s'appelle Frankenshtein ? Il est fabriqué avec des bouts d'humains décomposés retrouvé au fond d'un puit ? :o

Reply

Marsh Posté le 31-10-2006 à 14:43:54    

donc d'après toi il n'y à pas moyen de faire une insertion multiple avec une seul requète sous MS SQL 6.5 ?
 
MS SQL 6.5 c'est par ce que c'est un système qui tourne depuis la nuit des temps et qui n'a jamais eu besoin dévoluer (jusqu'à présent...)
 
PS : avec ou sans INTO ça à l'air de marcher pareil  :pt1cable:

Reply

Marsh Posté le 31-10-2006 à 14:47:37    

1/ oui
2/ boarf, format c: pis ça va résoudre le problème de version de SQL Server :ange:
3/ ouais, mais si je te dis de pas faire des trucs de MySQL comme un goret, c'est pas pour faire des trucs de MSSQL comme un goret ensuite ;)


Message édité par MagicBuzz le 31-10-2006 à 14:47:48
Reply

Marsh Posté le 31-10-2006 à 14:47:37   

Reply

Marsh Posté le 31-10-2006 à 14:57:29    

1) bon tant pis
2) ça ne tiens pas à moi...
3) lol, ok je laisse le INTO
 
merci pour ton aide :)
 
 :hello:

Reply

Marsh Posté le 05-10-2007 à 09:10:36    

Bonjour,
 
J'ai un problème similaire à celui cité ci-

Reply

Marsh Posté le 05-10-2007 à 10:38:31    

Réexplique de A à Z le problème alors.
 
Parceque j'ai beau relire le topic, je ne vois pas comment ZeBorG a pu avoir un problème.
D'autant qu'on a abordé pas mal de points...
 
1/ Trigger sur l'insertion pour prendre des décisions sur les doublons
2/ Inserrer UNE SEULE PUTAIN DE LIGNE A LA FOIS, stop aux merdes proprio de MySQL


Message édité par MagicBuzz le 05-10-2007 à 10:41:24
Reply

Marsh Posté le 05-10-2007 à 11:14:58    

Surtout que si le code est bien ecrit, c'est plus facile et plus propre de generer X insert simple, que de generer un gros insert baveux.


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 05-10-2007 à 11:19:17    

vainsang, tu en es où par rapport à ton problème de départ stp ?

Reply

Marsh Posté le 05-10-2007 à 11:46:54    

Si tes données proviennent d'une autre table (temporaire peut-être) tu peux faire un simple :
 
insert into personne (nom, age)
select n.nom, n.age
from new_data n left outer join personne u on n.nom = u.nom
where u.nom is null;

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed