gonzalo123 / sqlutils
带有PostgreSQL的Sql工具
dev-master / 1.0.x-dev
2016-10-07 12:07 UTC
Requires (Dev)
- doctrine/dbal: ^2.5
This package is not auto-updated.
Last update: 2024-09-23 14:21:43 UTC
README
PostgreSQL的Sql工具
upsert
如何执行UPDATE语句或INSERT语句,如果行不存在。
想象以下表
CREATE TABLE PUBLIC.TBUPSERTEXAMPLE ( KEY1 CHARACTER VARYING(10) NOT NULL, KEY2 CHARACTER VARYING(14) NOT NULL, KEY3 CHARACTER VARYING(14) NOT NULL, KEY4 CHARACTER VARYING(14) NOT NULL, VALUE1 CHARACTER VARYING(20), VALUE2 CHARACTER VARYING(20) NOT NULL, VALUE3 CHARACTER VARYING(100), VALUE4 CHARACTER VARYING(400), VALUE5 CHARACTER VARYING(20), CONSTRAINT TBUPSERTEXAMPLE_PKEY PRIMARY KEY (KEY1, KEY2, KEY3, KEY4) )
我们可以执行一个'upsert'语句,如下所示
WITH upsert AS ( UPDATE PUBLIC.TBUPSERTEXAMPLE SET VALUE1 = :VALUE1, VALUE2 = :VALUE2, VALUE3 = :VALUE3, VALUE4 = :VALUE4, VALUE5 = :VALUE5 WHERE KEY1 = :KEY1 AND KEY2 = :KEY2 AND KEY2 = :KEY3 AND KEY3 = :KEY4 RETURNING * ) INSERT INTO PUBLIC.TBUPSERTEXAMPLE(KEY1, KEY2, KEY3, KEY4, VALUE1, VALUE2, VALUE3, VALUE4, VALUE5) SELECT`` :KEY1, :KEY2, :KEY3, :KEY4, :VALUE1, :VALUE2, :VALUE3, :VALUE4, :VALUE5 WHERE NOT EXISTS (SELECT 1 FROM upsert);
但是自从PostgreSQL 9.5以来,我们也可以这样做
insert into PUBLIC.TBUPSERTEXAMPLE (key1, key2, key3, key4, value1, value2, value3, value4, value5) values (:KEY1, :KEY2, :KEY3, :KEY4, :VALUE1, :VALUE2, :VALUE3, :VALUE4, :VALUE5) on conflict (key1, key2, key3, key4) do update set value1 = :VALUE1, value2 = :VALUE1, value3 = :VALUE1, value4 = :VALUE1, value5 = :VALUE1 where TBUPSERTEXAMPLE.key1 = :KEY1 and TBUPSERTEXAMPLE.key2 = :KEY2 and TBUPSERTEXAMPLE.key3 = :KEY3 and TBUPSERTEXAMPLE.key4 = :KEY4;
PDO使用示例
use G\SqlUtils\Upsert; $conn = new PDO('pgsql:dbname=gonzalo;host=localhost', 'username', 'password'); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $conn->beginTransaction(); try { Upsert::createFromPDO($conn)->exec('PUBLIC.TBUPSERTEXAMPLE', [ 'KEY1' => 'key1', 'KEY2' => 'key2', 'KEY3' => 'key3', 'KEY4' => 'key4', ], [ 'VALUE1' => 'value1', 'VALUE2' => 'value2', 'VALUE3' => 'value3', 'VALUE4' => 'value4', 'VALUE5' => 'value5', ]); $conn->commit(); } catch (Exception $e) { $conn->rollback(); throw $e; }
DBAL使用示例
use Doctrine\DBAL\DriverManager; use G\SqlUtils\Upsert; $connectionParams = [ 'dbname' => 'gonzalo', 'user' => 'username', 'password' => 'password', 'host' => 'localhost', 'driver' => 'pdo_pgsql', ]; $dbh = DriverManager::getConnection($connectionParams); $dbh->transactional(function ($conn) { Upsert::createFromDBAL($conn)->exec('PUBLIC.TBUPSERTEXAMPLE', [ 'KEY1' => 'key1', 'KEY2' => 'key2', 'KEY3' => 'key3', 'KEY4' => 'key4', ], [ 'VALUE1' => 'value1', 'VALUE2' => 'value2', 'VALUE3' => 'value3', 'VALUE4' => null, 'VALUE5' => 'value5', ]); });