DML
INSERT INTO orders (customer_name, amount)VALUES ('Alice Smith', 149.99);RETURNING
Section intitulée « RETURNING »Retourne des valeurs de la ligne insérée :
INSERT INTO orders (customer_name, amount)VALUES ('Bob Johnson', 75.50)RETURNING id;
INSERT INTO orders (customer_name, amount)VALUES ('Carol', 200.00)RETURNING *;Insertion depuis une requête
Section intitulée « Insertion depuis une requête »INSERT INTO archive (customer_name, amount)SELECT customer_name, amount FROM orders WHERE status = 'delivered';INSERT … ON CONFLICT (Upsert)
Section intitulée « INSERT … ON CONFLICT (Upsert) »Ignorer les lignes en conflit :
INSERT INTO users (email, name)VALUES ('alice@example.com', 'Alice')ON CONFLICT DO NOTHING;Mettre à jour en cas de conflit avec des colonnes spécifiques :
INSERT INTO users (email, name)VALUES ('alice@example.com', 'Alice Updated')ON CONFLICT (email) DO UPDATE SET name = 'Alice Updated';Peut être combiné avec RETURNING :
INSERT INTO users (email, name)VALUES ('alice@example.com', 'Alice')ON CONFLICT (email) DO UPDATE SET name = 'Alice'RETURNING *;UPDATE orders SET status = 'shipped' WHERE amount > 100;Mise à jour en masse depuis VALUES
Section intitulée « Mise à jour en masse depuis VALUES »UPDATE ... FROM style PostgreSQL :
UPDATE orders SET status = d.status FROM (VALUES ('ord-1', 'shipped'), ('ord-2', 'delivered')) AS d (id, status) WHERE orders.id = d.id;UPDATE avec RETURNING
Section intitulée « UPDATE avec RETURNING »UPDATE orders SET status = 'shipped'WHERE id = 42RETURNING id, status;DELETE FROM orders WHERE status = 'delivered';DELETE … USING
Section intitulée « DELETE … USING »Joindre d’autres tables pour déterminer les lignes à supprimer :
DELETE FROM ordersUSING customersWHERE orders.customer_id = customers.id AND customers.status = 'inactive';Plusieurs tables USING :
DELETE FROM order_itemsUSING products, categoriesWHERE order_items.product_id = products.id AND products.category_id = categories.id AND categories.name = 'discontinued';DELETE avec RETURNING
Section intitulée « DELETE avec RETURNING »DELETE FROM orders WHERE status = 'delivered'RETURNING *;Import et export de données en masse au format CSV.
COPY FROM
Section intitulée « COPY FROM »Importer des lignes depuis un fichier CSV :
COPY orders FROM 'data/orders.csv';COPY orders FROM 'data/orders.csv' WITH (HEADER);COPY orders FROM 'data/orders.csv' WITH (HEADER, DELIMITER '|');COPY orders (customer_name, amount) FROM 'data/partial.csv' WITH (HEADER);Exporter une table ou une requête vers un fichier CSV :
COPY orders TO 'export/orders.csv';COPY orders TO 'export/orders.csv' WITH (HEADER);COPY (SELECT * FROM orders WHERE status = 'pending') TO 'export/pending.csv' WITH (HEADER);| Option | Description |
|---|---|
HEADER | La première ligne est un en-tête (ignoré à l’import, écrit à l’export) |
DELIMITER 'c' | Caractère séparateur de champs (par défaut : ,) |
csv_file() — Interroger des fichiers CSV directement
Section intitulée « csv_file() — Interroger des fichiers CSV directement »Interrogez un fichier CSV comme table virtuelle sans importation :
SELECT * FROM csv_file('data/sales.csv');SELECT name, age::int FROM csv_file('data/people.csv') WHERE age::int > 25;Toutes les valeurs sont retournées en TEXT — utilisez ::type pour la conversion. Supporte WHERE, ORDER BY, LIMIT, JOIN et les agrégats.
Options :
csv_file('path') -- avec en-tête (par défaut)csv_file('path', false) -- sans en-tête (colonnes nommées column1, column2, ...)csv_file('path', true, '|') -- délimiteur personnaliséJointure de fichiers CSV entre eux ou avec des tables de la base de données :
SELECT e.name, d.departmentFROM csv_file('employees.csv') eJOIN csv_file('departments.csv') d ON e.dept_id = d.id;Tables virtuelles
Section intitulée « Tables virtuelles »Enregistrez des sources de données externes comme tables interrogeables avec CREATE VIRTUAL TABLE :
CREATE VIRTUAL TABLE sales USING csv('data/sales.csv');CREATE VIRTUAL TABLE sales USING csv('data/sales.csv', 'no_header', '|');
SELECT * FROM sales WHERE amount::int > 100;DROP TABLE sales;Les tables virtuelles apparaissent dans SHOW TABLES et supportent SELECT, WHERE, JOIN, ORDER BY et les agrégats. Elles sont en lecture seule — INSERT, UPDATE et DELETE ne sont pas supportés.
Le module csv intégré est enregistré par défaut. Des modules personnalisés peuvent être enregistrés via l’API Scala :
db.registerVirtualTableModule("mymodule", new VirtualTableModule { ... })