[{"data":1,"prerenderedAt":693},["ShallowReactive",2],{"page-\u002Fsql\u002Fmodifier-les-donnees":3,"pieces-sql":650,"autour-\u002Fsql\u002Fmodifier-les-donnees":675,"prerequis-\u002Fsql\u002Fmodifier-les-donnees":680,"plan-sql":682},{"id":4,"title":5,"body":6,"description":621,"extension":622,"ligne":57,"meta":623,"motsCles":624,"navigation":627,"niveau":628,"path":629,"prerequis":630,"ressources":632,"seo":641,"sources":642,"stem":648,"__hash__":649},"docs\u002Fsql\u002F02.modifier-les-donnees.md","Ajouter, modifier et supprimer des lignes",{"type":7,"value":8,"toc":610},"minimark",[9,14,48,52,97,101,112,115,159,164,168,181,214,220,224,265,273,276,319,322,362,366,393,396,400,403,436,447,457,478,482,485,509,513,516,547,550,556,560,606],[10,11,13],"h2",{"id":12},"ce-que-tu-vas-apprendre","Ce que tu vas apprendre",[15,16,17,26,36],"ul",{},[18,19,20,21,25],"li",{},"Ajouter des lignes avec ",[22,23,24],"code",{},"INSERT",".",[18,27,28,29,32,33,25],{},"Changer des valeurs existantes avec ",[22,30,31],{},"UPDATE"," et retirer des lignes avec ",[22,34,35],{},"DELETE",[18,37,38,39,41,42,44,45,25],{},"Éviter l'erreur classique : un ",[22,40,31],{}," ou un ",[22,43,35],{}," sans ",[22,46,47],{},"WHERE",[10,49,51],{"id":50},"insert-ajouter-une-ligne","INSERT : ajouter une ligne",[53,54,59],"pre",{"className":55,"code":56,"language":57,"meta":58,"style":58},"language-sql shiki shiki-themes github-light-default github-dark-default github-dark-default","INSERT INTO recettes (titre, temps_minutes)\nVALUES ('Crêpes', 30);\n","sql","",[22,60,61,74],{"__ignoreMap":58},[62,63,66,70],"span",{"class":64,"line":65},"line",1,[62,67,69],{"class":68},"sOnC1","INSERT INTO",[62,71,73],{"class":72},"scfrF"," recettes (titre, temps_minutes)\n",[62,75,77,80,83,87,90,94],{"class":64,"line":76},2,[62,78,79],{"class":68},"VALUES",[62,81,82],{"class":72}," (",[62,84,86],{"class":85},"shWOn","'Crêpes'",[62,88,89],{"class":72},", ",[62,91,93],{"class":92},"s5iOY","30",[62,95,96],{"class":72},");\n",[98,99,100],"p",{},"La première parenthèse liste les colonnes à remplir. La seconde donne les valeurs, dans le même ordre.",[98,102,103,104,107,108,111],{},"Les colonnes que tu ne cites pas reçoivent leur valeur par défaut, ou ",[22,105,106],{},"NULL"," à défaut. C'est ainsi que ",[22,109,110],{},"id"," peut se remplir tout seul (voir le cours 03).",[98,113,114],{},"Pour ajouter plusieurs lignes d'un coup, sépare-les par des virgules :",[53,116,118],{"className":55,"code":117,"language":57,"meta":58,"style":58},"INSERT INTO recettes (titre, temps_minutes)\nVALUES ('Quiche lorraine', 55),\n       ('Soupe à l''oignon', 45);\n",[22,119,120,126,143],{"__ignoreMap":58},[62,121,122,124],{"class":64,"line":65},[62,123,69],{"class":68},[62,125,73],{"class":72},[62,127,128,130,132,135,137,140],{"class":64,"line":76},[62,129,79],{"class":68},[62,131,82],{"class":72},[62,133,134],{"class":85},"'Quiche lorraine'",[62,136,89],{"class":72},[62,138,139],{"class":92},"55",[62,141,142],{"class":72},"),\n",[62,144,146,149,152,154,157],{"class":64,"line":145},3,[62,147,148],{"class":72},"       (",[62,150,151],{"class":85},"'Soupe à l''oignon'",[62,153,89],{"class":72},[62,155,156],{"class":92},"45",[62,158,96],{"class":72},[98,160,161,162,25],{},"Pour écrire une apostrophe dans un texte, double-la : ",[22,163,151],{},[10,165,167],{"id":166},"récupérer-ce-qui-vient-dêtre-créé","Récupérer ce qui vient d'être créé",[98,169,170,171,173,174,176,177,180],{},"Après un ",[22,172,24],{},", tu veux souvent connaître l'",[22,175,110],{}," donné à la nouvelle ligne. Ajoute ",[22,178,179],{},"RETURNING"," :",[53,182,184],{"className":55,"code":183,"language":57,"meta":58,"style":58},"INSERT INTO recettes (titre, temps_minutes)\nVALUES ('Flan pâtissier', 70)\nRETURNING id;\n",[22,185,186,192,209],{"__ignoreMap":58},[62,187,188,190],{"class":64,"line":65},[62,189,69],{"class":68},[62,191,73],{"class":72},[62,193,194,196,198,201,203,206],{"class":64,"line":76},[62,195,79],{"class":68},[62,197,82],{"class":72},[62,199,200],{"class":85},"'Flan pâtissier'",[62,202,89],{"class":72},[62,204,205],{"class":92},"70",[62,207,208],{"class":72},")\n",[62,210,211],{"class":64,"line":145},[62,212,213],{"class":72},"RETURNING id;\n",[98,215,216,217,25],{},"PostgreSQL renvoie les colonnes demandées pour la ligne insérée, comme un ",[22,218,219],{},"SELECT",[10,221,223],{"id":222},"update-modifier-des-lignes","UPDATE : modifier des lignes",[53,225,227],{"className":55,"code":226,"language":57,"meta":58,"style":58},"UPDATE recettes\nSET temps_minutes = 50\nWHERE id = 4;\n",[22,228,229,236,250],{"__ignoreMap":58},[62,230,231,233],{"class":64,"line":65},[62,232,31],{"class":68},[62,234,235],{"class":72}," recettes\n",[62,237,238,241,244,247],{"class":64,"line":76},[62,239,240],{"class":68},"SET",[62,242,243],{"class":72}," temps_minutes ",[62,245,246],{"class":68},"=",[62,248,249],{"class":92}," 50\n",[62,251,252,254,257,259,262],{"class":64,"line":145},[62,253,47],{"class":68},[62,255,256],{"class":72}," id ",[62,258,246],{"class":68},[62,260,261],{"class":92}," 4",[62,263,264],{"class":72},";\n",[98,266,267,269,270,272],{},[22,268,240],{}," indique la nouvelle valeur. ",[22,271,47],{}," choisit les lignes concernées. Ici, seule la recette numéro 4 change.",[98,274,275],{},"Tu peux modifier plusieurs colonnes à la fois :",[53,277,279],{"className":55,"code":278,"language":57,"meta":58,"style":58},"UPDATE recettes\nSET titre = 'Tarte aux pommes maison', temps_minutes = 55\nWHERE id = 4;\n",[22,280,281,287,307],{"__ignoreMap":58},[62,282,283,285],{"class":64,"line":65},[62,284,31],{"class":68},[62,286,235],{"class":72},[62,288,289,291,294,296,299,302,304],{"class":64,"line":76},[62,290,240],{"class":68},[62,292,293],{"class":72}," titre ",[62,295,246],{"class":68},[62,297,298],{"class":85}," 'Tarte aux pommes maison'",[62,300,301],{"class":72},", temps_minutes ",[62,303,246],{"class":68},[62,305,306],{"class":92}," 55\n",[62,308,309,311,313,315,317],{"class":64,"line":145},[62,310,47],{"class":68},[62,312,256],{"class":72},[62,314,246],{"class":68},[62,316,261],{"class":92},[62,318,264],{"class":72},[98,320,321],{},"Tu peux aussi calculer à partir de l'ancienne valeur :",[53,323,325],{"className":55,"code":324,"language":57,"meta":58,"style":58},"UPDATE recettes\nSET temps_minutes = temps_minutes + 10\nWHERE titre = 'Gratin dauphinois';\n",[22,326,327,333,349],{"__ignoreMap":58},[62,328,329,331],{"class":64,"line":65},[62,330,31],{"class":68},[62,332,235],{"class":72},[62,334,335,337,339,341,343,346],{"class":64,"line":76},[62,336,240],{"class":68},[62,338,243],{"class":72},[62,340,246],{"class":68},[62,342,243],{"class":72},[62,344,345],{"class":68},"+",[62,347,348],{"class":92}," 10\n",[62,350,351,353,355,357,360],{"class":64,"line":145},[62,352,47],{"class":68},[62,354,293],{"class":72},[62,356,246],{"class":68},[62,358,359],{"class":85}," 'Gratin dauphinois'",[62,361,264],{"class":72},[10,363,365],{"id":364},"delete-supprimer-des-lignes","DELETE : supprimer des lignes",[53,367,369],{"className":55,"code":368,"language":57,"meta":58,"style":58},"DELETE FROM recettes\nWHERE id = 5;\n",[22,370,371,380],{"__ignoreMap":58},[62,372,373,375,378],{"class":64,"line":65},[62,374,35],{"class":68},[62,376,377],{"class":68}," FROM",[62,379,235],{"class":72},[62,381,382,384,386,388,391],{"class":64,"line":76},[62,383,47],{"class":68},[62,385,256],{"class":72},[62,387,246],{"class":68},[62,389,390],{"class":92}," 5",[62,392,264],{"class":72},[98,394,395],{},"La ligne numéro 5 disparaît de la table. Il n'y a pas de corbeille : sauf si tu as une sauvegarde, elle est perdue.",[10,397,399],{"id":398},"le-danger-du-where-oublié","Le danger du WHERE oublié",[98,401,402],{},"Compare ces deux requêtes :",[53,404,406],{"className":55,"code":405,"language":57,"meta":58,"style":58},"DELETE FROM recettes WHERE id = 5;\nDELETE FROM recettes;\n",[22,407,408,427],{"__ignoreMap":58},[62,409,410,412,414,417,419,421,423,425],{"class":64,"line":65},[62,411,35],{"class":68},[62,413,377],{"class":68},[62,415,416],{"class":72}," recettes ",[62,418,47],{"class":68},[62,420,256],{"class":72},[62,422,246],{"class":68},[62,424,390],{"class":92},[62,426,264],{"class":72},[62,428,429,431,433],{"class":64,"line":76},[62,430,35],{"class":68},[62,432,377],{"class":68},[62,434,435],{"class":72}," recettes;\n",[98,437,438,439,443,444,446],{},"La première supprime une recette. La seconde supprime ",[440,441,442],"strong",{},"toutes"," les recettes. Sans ",[22,445,47],{},", la commande s'applique à chaque ligne de la table, et PostgreSQL ne demande aucune confirmation.",[98,448,449,450,452,453,456],{},"C'est pareil pour ",[22,451,31],{}," : ",[22,454,455],{},"UPDATE recettes SET temps_minutes = 0;"," met la durée de toutes les recettes à zéro.",[458,459,460],"warning",{},[98,461,462,463,41,465,467,468,470,471,473,474,477],{},"Avant d'écrire un ",[22,464,31],{},[22,466,35],{},", écris d'abord un ",[22,469,219],{}," avec le même ",[22,472,47],{},". Vérifie qu'il renvoie exactement les lignes visées, puis remplace ",[22,475,476],{},"SELECT *"," par la commande de modification.",[10,479,481],{"id":480},"prendre-lhabitude-sûre","Prendre l'habitude sûre",[98,483,484],{},"Voici une méthode en quatre étapes :",[486,487,488,495,501,506],"ol",{},[18,489,490,491,494],{},"Écris ",[22,492,493],{},"SELECT * FROM recettes WHERE id = 5;"," et regarde le résultat.",[18,496,497,498,25],{},"Si c'est la bonne ligne, transforme la requête en ",[22,499,500],{},"DELETE FROM recettes WHERE id = 5;",[18,502,503,504,25],{},"Relis la requête avant de l'exécuter, et vérifie la présence du ",[22,505,47],{},[18,507,508],{},"Pour les opérations sensibles, utilise une transaction, que tu verras au cours 06.",[10,510,512],{"id":511},"éviter-les-doublons-avec-on-conflict","Éviter les doublons avec ON CONFLICT",[98,514,515],{},"Si une colonne a une contrainte d'unicité, insérer deux fois la même valeur provoque une erreur. Pour ignorer l'ajout dans ce cas :",[53,517,519],{"className":55,"code":518,"language":57,"meta":58,"style":58},"INSERT INTO categories (nom)\nVALUES ('Entrées')\nON CONFLICT DO NOTHING;\n",[22,520,521,528,539],{"__ignoreMap":58},[62,522,523,525],{"class":64,"line":65},[62,524,69],{"class":68},[62,526,527],{"class":72}," categories (nom)\n",[62,529,530,532,534,537],{"class":64,"line":76},[62,531,79],{"class":68},[62,533,82],{"class":72},[62,535,536],{"class":85},"'Entrées'",[62,538,208],{"class":72},[62,540,541,544],{"class":64,"line":145},[62,542,543],{"class":68},"ON",[62,545,546],{"class":72}," CONFLICT DO NOTHING;\n",[98,548,549],{},"Si la ligne existe déjà, rien ne se passe et aucune erreur n'apparaît. Les contraintes sont expliquées au cours suivant.",[551,552,553],"tip",{},[98,554,555],{},"Tout ce que tu exécutes dans l'éditeur SQL d'un vrai projet s'applique à de vraies données. Entraîne-toi d'abord sur une base de test.",[10,557,559],{"id":558},"à-retenir","À retenir",[15,561,562,574,580,586,597],{},[18,563,564,567,568,570,571,573],{},[22,565,566],{},"INSERT INTO table (colonnes) VALUES (valeurs)"," ajoute des lignes ; ",[22,569,179],{}," renvoie par exemple l'",[22,572,110],{}," créé.",[18,575,576,579],{},[22,577,578],{},"UPDATE table SET colonne = valeur WHERE ..."," modifie des lignes existantes.",[18,581,582,585],{},[22,583,584],{},"DELETE FROM table WHERE ..."," supprime des lignes, sans retour en arrière possible.",[18,587,588,589,89,591,593,594,596],{},"Sans ",[22,590,47],{},[22,592,31],{}," et ",[22,595,35],{}," touchent toute la table.",[18,598,599,600,602,603,605],{},"Teste toujours le ",[22,601,47],{}," avec un ",[22,604,219],{}," avant de modifier ou de supprimer.",[607,608,609],"style",{},"html pre.shiki code .sOnC1, html code.shiki .sOnC1{--shiki-light:#CF222E;--shiki-default:#FF7B72;--shiki-dark:#FF7B72}html pre.shiki code .scfrF, html code.shiki .scfrF{--shiki-light:#1F2328;--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}html pre.shiki code .shWOn, html code.shiki .shWOn{--shiki-light:#0A3069;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html pre.shiki code .s5iOY, html code.shiki .s5iOY{--shiki-light:#0550AE;--shiki-default:#79C0FF;--shiki-dark:#79C0FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":58,"searchDepth":76,"depth":145,"links":611},[612,613,614,615,616,617,618,619,620],{"id":12,"depth":76,"text":13},{"id":50,"depth":76,"text":51},{"id":166,"depth":76,"text":167},{"id":222,"depth":76,"text":223},{"id":364,"depth":76,"text":365},{"id":398,"depth":76,"text":399},{"id":480,"depth":76,"text":481},{"id":511,"depth":76,"text":512},{"id":558,"depth":76,"text":559},"Écrire dans une base avec INSERT, UPDATE et DELETE, et comprendre pourquoi oublier le WHERE peut tout effacer.","md",{},[24,31,35,47,179,625,240,626],"ON CONFLICT","suppression",true,"debutant","\u002Fsql\u002Fmodifier-les-donnees",[631],"\u002Fsql\u002Fbase-relationnelle",[633,637],{"nom":634,"url":635,"type":636},"Documentation PostgreSQL en français, chapitre « Le langage SQL »","https:\u002F\u002Fdocs.postgresql.fr\u002Fcurrent\u002Ftutorial-sql.html","doc",{"nom":638,"url":639,"type":640},"SQL.sh, cours et tutoriels sur le langage SQL","https:\u002F\u002Fsql.sh\u002F","cours",{"title":5,"description":621},[643,645],{"nom":644,"url":635},"Documentation PostgreSQL en français, « Insertions », « Mises à jour » et « Suppressions »",{"nom":646,"url":647},"PostgreSQL, commande INSERT (en anglais)","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fsql-insert.html","sql\u002F02.modifier-les-donnees","KqCpY9Eq8YQuvnEvtl97370EQomPZcSFR7PRGrFN5AM",[651,654,655,659,663,667,671],{"path":631,"title":652,"stem":653},"La base relationnelle et SELECT","sql\u002F01.base-relationnelle",{"path":629,"title":5,"stem":648},{"path":656,"title":657,"stem":658},"\u002Fsql\u002Fcreer-des-tables","Créer des tables","sql\u002F03.creer-des-tables",{"path":660,"title":661,"stem":662},"\u002Fsql\u002Fjointures","Les jointures","sql\u002F04.jointures",{"path":664,"title":665,"stem":666},"\u002Fsql\u002Fagregats-et-index","Agrégats et index","sql\u002F05.agregats-et-index",{"path":668,"title":669,"stem":670},"\u002Fsql\u002Ftransactions-et-injection","Transactions et injection SQL","sql\u002F06.transactions-et-injection",{"path":672,"title":673,"stem":674},"\u002Fsql","SQL","sql\u002Findex",[676,678],{"title":652,"path":631,"stem":653,"description":677,"children":-1},"Comprendre les tables, les lignes, les colonnes et la clé primaire, puis lire des données avec SELECT, WHERE, ORDER BY et LIMIT.",{"title":657,"path":656,"stem":658,"description":679,"children":-1},"Définir ses propres tables avec CREATE TABLE, choisir les types, poser des contraintes et relier les tables par des clés étrangères.",[681],{"path":631,"title":652,"ligne":57},[683,684,685,686,688,689,691],{"path":631,"title":652,"niveau":628,"stem":653},{"path":629,"title":5,"niveau":628,"stem":648},{"path":656,"title":657,"niveau":628,"stem":658},{"path":660,"title":661,"niveau":687,"stem":662},"intermediaire",{"path":664,"title":665,"niveau":687,"stem":666},{"path":668,"title":669,"niveau":690,"stem":670},"avance",{"path":672,"title":673,"niveau":692,"stem":674},"memo",1794583462907]