« MySQL/Manipulation de données » : différence entre les versions

Contenu supprimé Contenu ajouté
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
Ligne 3 :
== INSERT ==
La syntaxe est la suivante :
<sourcesyntaxhighlight lang=mysql>
INSERT INTO TableName (Column1, Column2, Column3)
VALUES (value1, value2, value3)
</syntaxhighlight>
</source>
Ce qui effectue les opérations suivantes : <code>insert value1 into Column1, value2 into Column2, and value3 into Column3</code>.
 
Insérer un enregistrement (les valeurs sont insérées dans l'ordre où les colonnes apparaissent dans la base) :
<sourcesyntaxhighlight lang=mysql>
INSERT INTO TableName
VALUES (value1, value2, value3)
</syntaxhighlight>
</source>
 
Deux lignes :
<sourcesyntaxhighlight lang=mysql>
INSERT INTO TableName
VALUES (value1, value2, value3), (value4, value5, value6)
Ligne 22 :
INSERT INTO antiques VALUES (21, 01, 'Ottoman', 200.00);
INSERT INTO antiques (buyerid, sellerid, item) VALUES (01, 21, 'Ottoman');
</syntaxhighlight>
</source>
 
Copier ceux d'une autre table :
<sourcesyntaxhighlight lang=mysql>
INSERT INTO table1(field1, field2)
SELECT field1, field2
FROM table2
</syntaxhighlight>
</source>
 
Copier une ligne :
<sourcesyntaxhighlight lang=mysql>
INSERT INTO World_Events SELECT * FROM National_Events
</syntaxhighlight>
</source>
 
{{attention|Il vaut mieux sélectionner chaque champ à copier sinon la contrainte d'unicité sur la clé primaire peut faire échouer l'insertion.}}
Ligne 46 :
 
== UPDATE ==
<sourcesyntaxhighlight lang=sql>
UPDATE table SET field1 = newvalue1, field2 = newvalue2 WHERE criteria ORDER BY field LIMIT n
</syntaxhighlight>
</source>
 
Exemples :
<sourcesyntaxhighlight lang=sql>
UPDATE owner SET ownerfirstname = 'John'
WHERE ownerid = (SELECT buyerid FROM antiques WHERE item = 'Bookcase');
Ligne 74 :
UPDATE posts SET deleted=True
ORDER BY date LIMIT 1
</syntaxhighlight>
</source>
 
Avec <code>ORDER BY</code> il est possible de classer les enregistrements avant l'insertion, voire même sur un nombre donné de lignes (avec <code>LIMIT</code>).
Ligne 97 :
 
== DELETE et TRUNCATE ==
<sourcesyntaxhighlight lang=sql>
DELETE [QUICK] FROM `table1`
TRUNCATE [TABLE] `table1`
</syntaxhighlight>
</source>
 
Quelques précisions :
Ligne 111 :
* Après une suppression massive (au moins 30 % des lignes), il convient de lancer <code>OPTIMIZE TABLE</code> juste après pour accélérer la suite.
* Sur des tables InnoDB avec contraintes <code>FOREIGN KEY</code>, <code>TRUNCATE</code> se comporte comme <code>DELETE</code>.
<sourcesyntaxhighlight lang=sql>
DELETE FROM `antiques`
WHERE item = 'Ottoman'
ORDER BY `id`
LIMIT 1
</syntaxhighlight>
</source>
Il est possible de classer les lignes avant leur suppression, tout en en choisissant le nombre.
 
Pour supprimer des enregistrements de plusieurs tables (''multi-table delete''<ref>https://dev.mysql.com/doc/refman/5.7/en/delete.html</ref> ou ''cross table delete'') :
<sourcesyntaxhighlight lang=sql>
DELETE t1, t2
FROM t1
LEFT JOIN t2
WHERE t1.id=t2.id AND t1.value > 1;
</syntaxhighlight>
</source>
 
Synonyme :
<sourcesyntaxhighlight lang=sql>
DELETE FROM t1, t2
USING t1
Ligne 134 :
ON t1.id = t2.id
WHERE t1.value > 1;
</syntaxhighlight>
</source>
 
Toutefois dans les version inférieures à la 4 (et étonnamment constaté comme fausse alerte par PhpMyAdmin sur des versions ultérieures), les jointures sont interdites dans les suppressions, et on doit alors utiliser le <code>WHERE</code><ref>https://www.electrictoolbox.com/article/mysql/cross-table-delete/</ref> :
<sourcesyntaxhighlight lang=sql>
DELETE t1, t2
FROM table1 t1, table2 t2
WHERE t1.id=t2.id AND t1.value > 1;
</syntaxhighlight>
</source>
 
{{attention|Comme la clause <code>LIMIT</code> ne fonctionne pas sur les suppressions multiples, il faut contourner en supprimant les enregistrements retournés par un <code>SELECT</code> avec <code>LIMIT</code>.}}