DELETE
SQL DELETE expressions allow you to remove rows from a database.
The delete function from Database.Beam.Query can be used to delete
rows from a particular table. The function takes a table and a
condition for the WHERE clause. The function returns a SqlDelete
object that can be run in MonadBeam with runDelete.
For example, to delete any customer, whose first name is Emilio.
runDelete $ delete (customer chinookDb)
(\c -> customerFirstName c ==. "Emilio")
DELETE
FROM "Customer" AS "delete_target"
WHERE ("delete_target"."FirstName") = ('Emilio');
DELETE
FROM "Customer"
WHERE ("FirstName")=(?);
-- With values: [SQLText "Emilio"];
DELETE is fairly simple compared to the other manipulation commands,
so that's really all there is to it. Expressions for the WHERE
clause can be arbitrarily complex, assuming your backend supports it.
For example, to delete any invoice with more than five invoice lines
runDelete $ delete (invoice chinookDb)
(\i -> 5 <. subquery_ (aggregate_ (\_ -> as_ @Int32 countAll_) $
invoiceLines i))
DELETE
FROM "Invoice"
WHERE (?)<(
(SELECT COUNT(*) AS "res0"
FROM "InvoiceLine" AS "t0"
WHERE ("t0"."InvoiceId")=("InvoiceId")));
-- With values: [SQLInteger 5];
Note
The example above was only given for SQLite because it violates a foreign key constraint in the underlying database, and other backends are more pedantic