前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >upsert----非标准DML语句

upsert----非标准DML语句

作者头像
cultureSun
发布2023-05-18 14:40:14
3300
发布2023-05-18 14:40:14
举报
文章被收录于专栏:cultureSun学安全cultureSun学安全

简介

DML:全称Data manipulation Language,是数据库操作语句,例如select、insert、update等等。 按照国际化标准组织1992年发布的数据库SQL语言标准 ( ISO/IEC 9075:1992, Database Language SQL- July 30, 1992),是不包括upsert,所以仅有部分数据库支持upsert操作。

详解

upsert 是 update 和 insert 的组合。如果表中已经存在指定值,则更新现有行,如果指定值不存在,则插入新行。

语法

UPSERT INTO table_name (字段1, 字段2,...) VALUES (字段1值, 字段2值, ...);

实例

创建people表,并插入如下数据。

id(主键)

name

1

tom

2

john

UPSERT INTO people (id, name) VALUES (2, 'mike'); 更新id为2的行数据,表数据如下:

id(主键)

name

1

tom

2

mike

UPSERT INTO people (id, name) VALUES (3, 'anna'); 插入id为3的行数据,表数据如下:

id(主键)

name

1

tom

2

mike

3

anna

MySQL实现upsert

INSERT INTO INTO table_name (字段1,字段2,...) VALUES (字段1值, 字段2值, ...) ON DUPLICATE KEY UPDATE; 例子: INSERT INTO INTO people (id,name) VALUES (2,'reva') ON DUPLICATE KEY UPDATE;

postgre实现upsert

INSERT INTO INTO table_name (字段1,字段2,...) VALUES (字段1值, 字段2值, ...) ON CONFLICT conflict_target conflict_action; conflict_target :指定判断字段 conflict_action :指定操作 例子: INSERT INTO people (id,name) VALUES (2,'reva') ON CONFLICT (id) DO UPDATE;

SQL server实现upsert

可以先查询表中是否有数据,然后再做插入或更新操作。

代码语言:javascript
复制
IF EXISTS (SELECT 1 FROM table_A WHERE Id = @Id)
    BEGIN
        UPDATE table_A SET Value = @Value WHERE Id = @Id;
    END
ELSE
    BEGIN
        INSERT INTO table_A (Id, Value) VALUES(@Id, @Value)
    END

SQL

还可以使用MERGE实现 语法:

代码语言:javascript
复制
MERGE target_table  --被操作表
USING source_table  --源数据表,可以是子查询
ON target_table.column=source_table.column --两个表的某个列作匹配
WHEN MATCHED THEN --被操作表数据的存在源数据表中时,执行以下语句
语句
WHEN NOT MATCHED THEN --被操作表数据的不存在源数据表中,执行以下语句
语句
WHEN NOT MATCHED BY SOURCE THEN --源数据表数据的不存在被操作表中,执行以下语句
语句;

SQL

例子:

代码语言:javascript
复制
MERGE people as target
USING (values('1','aaa'),('4','ddd')) as source(id,name)
ON target.id=source.id
WHEN MATCHED THEN 
update set target.name=source.name
WHEN NOT MATCHED THEN 
insert values(source.id,source.name)
WHEN NOT MATCHED BY SOURCE THEN 
delete;

people表存在源表数据则更新,不存在插入,people表有源没有则删除,也可以不执行删除操作(把delete删除)。以最初people表数据为准,执行后表数据如下:

id(主键)

name

1

aaa

4

ddd

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 详解
    • 语法
      • 实例
        • MySQL实现upsert
          • postgre实现upsert
            • SQL server实现upsert
            相关产品与服务
            数据库
            云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档