說明:
今天在使用log4j將日誌信息寫入數據庫時有這麼一個需求:如果數據庫存在一條記錄,則將新插入的值,作爲更新,如果沒有這樣一條記錄,則新增。
實現:
表結構:
通過查閱資料發現postgre有這麼一個方法:insert on conflict do 實現如下
INSERT INTO "warnLog" ("datatime", "log_level", "method", "connector_name", "location", "message") VALUES ('%d{yyyy-MM-dd HH:mm}','%p','%M','%X{connector_name}','%l','%m')
ON conflict ("datatime","method", "connector_name", "location") DO
UPDATE "warnLog" SET "datatime" = '%d{yyyy-MM-dd HH:mm}' ,"log_level" = '%p', "method" = '%M', "connector_name" = '%X{connector_name}', "location" = '%l', "message" = '%m';
注意:conflict(這裏面的值一定的是主鍵或者唯一值)
完整語法如下:看不懂可以忽略
Command: INSERT
Description: create new rows in a table
Syntax:
[ WITH [ RECURSIVE ] with_query [, ...] ]
INSERT INTO table_name [ AS alias ] [ ( column_name [, ...] ) ]
{ DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
[ ON CONFLICT [ conflict_target ] conflict_action ]
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
where conflict_target can be one of:
( { index_column_name | ( index_expression ) } [ COLLATE collation ] [ opclass ] [, ...] ) [ WHERE index_predicate ]
ON CONSTRAINT constraint_name
and conflict_action is one of:
DO NOTHING
DO UPDATE SET { column_name = { expression | DEFAULT } |
( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) |
( column_name [, ...] ) = ( sub-SELECT )
} [, ...]
[ WHERE condition ]