Aller au contenu

DML

INSERT INTO orders (customer_name, amount)
VALUES ('Alice Smith', 149.99);

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 *;
INSERT INTO archive (customer_name, amount)
SELECT customer_name, amount FROM orders WHERE status = 'delivered';

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;

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 orders SET status = 'shipped'
WHERE id = 42
RETURNING id, status;
DELETE FROM orders WHERE status = 'delivered';

Joindre d’autres tables pour déterminer les lignes à supprimer :

DELETE FROM orders
USING customers
WHERE orders.customer_id = customers.id
AND customers.status = 'inactive';

Plusieurs tables USING :

DELETE FROM order_items
USING products, categories
WHERE order_items.product_id = products.id
AND products.category_id = categories.id
AND categories.name = 'discontinued';
DELETE FROM orders WHERE status = 'delivered'
RETURNING *;

Import et export de données en masse au format CSV.

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);
OptionDescription
HEADERLa 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.department
FROM csv_file('employees.csv') e
JOIN csv_file('departments.csv') d ON e.dept_id = d.id;

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 { ... })