SQL::Composer::Upsert - UPSERT statement emulation
SYNOPSIS
my $upsert = SQL::Composer::Upsert->new(
into => 'table',
values => [ id => 1, foo => 'bar' ],
driver => $driver # driver must be set
);
my $sql = $upsert->to_sql;
# SQLite: 'INSERT INTO `table` (`id`, `foo`) VALUES (?, ?) ON CONFLICT UPDATE'
# MySQL: 'INSERT INTO `table` (`id`, `foo`) VALUES (?, ?) ON DUPLICATE KEY UPDATE'
# Pg: 'INSERT INTO `table` (`id`, `foo`) VALUES (?, ?) ON CONFLICT DO UPDATE'
my @bind = $upsert->to_bind; # [1, 'bar']
DESCRIPTION
This emulates the UPSERT
statement, which is defined as an attempt to INSERT
failing due to a key constraint and the query being turned into an UPDATE
instead.
CAVEAT
Since this feature is not universally supported, you must specify a driver
when creating SQL::Composer::Upsert
instance so that we can generate the correct SQL.
It should also be noted that we support the lowest common denominator, which is the basic UPSERT
behavior even though some RDBMS support more complex features.