Command guide
advanced upserting MySQL MariaDB SQL Server PostgreSQL SQLite
Insert Or Update A Row With UPSERT
Atomically insert a row if it does not exist or update it if it does, using the database's native conflict-resolution syntax.
5/5 supported engines validation-green 1 example 2 scenarios
Docker-validated Not currently validation-green
Example 1
Record a page view, inserting on first visit or incrementing on return
The home page already exists with 5 views. The upsert detects the conflict on the primary key and increments views to 6 instead of inserting a duplicate. If home had not existed, a new row with views = 1 would have been inserted.
Source table data Setup
CREATE TABLE page_views (page VARCHAR(100) PRIMARY KEY, views INT);
INSERT INTO
page_views (page, views)
VALUES
('home', 5);
Validated query SQL
INSERT INTO
page_views (page, views)
VALUES
('home', 1) ON DUPLICATE KEY
UPDATE views = views + 1;
SELECT
page,
views
FROM
page_views
ORDER BY
page;
Source table data Setup
CREATE TABLE page_views (page VARCHAR(100) PRIMARY KEY, views INT);
INSERT INTO
page_views (page, views)
VALUES
('home', 5);
Validated query SQL
;
MERGE page_views AS target USING (
VALUES
('home', 1)
) AS source (page, views) ON target.page = source.page WHEN MATCHED THEN
UPDATE
SET
views = target.views + 1 WHEN NOT MATCHED THEN INSERT (page, views)
VALUES
(source.page, source.views);
SELECT
page,
views
FROM
page_views
ORDER BY
page;
Source table data Setup
CREATE TABLE page_views (page VARCHAR(100) PRIMARY KEY, views INT);
INSERT INTO
page_views (page, views)
VALUES
('home', 5);
Validated query SQL
INSERT INTO
page_views (page, views)
VALUES
('home', 1) ON CONFLICT (page) DO
UPDATE
SET
views = page_views.views + 1;
SELECT
page,
views
FROM
page_views
ORDER BY
page;
Source table data Setup
CREATE TABLE page_views (page VARCHAR(100) PRIMARY KEY, views INT);
INSERT INTO
page_views (page, views)
VALUES
('home', 5);
Validated query SQL
INSERT INTO
page_views (page, views)
VALUES
('home', 1) ON CONFLICT (page) DO
UPDATE
SET
views = page_views.views + 1;
SELECT
page,
views
FROM
page_views
ORDER BY
page;
Each engine uses different upsert syntax. The final table state is identical: views incremented from 5 to 6.