首页 > 数据库 >mysql,sqlserver,oracle各自的存在更新不存在添加写法

mysql,sqlserver,oracle各自的存在更新不存在添加写法

时间:2023-10-23 12:55:48浏览次数:48  
标签:into sqlserver AccountName 插入 mysql oracle where id AccountID

mysql,sqlserver,oracle各自的存在更新不存在添加写法

在向表中插入数据的时候,经常遇到这样的情况:

  1. 首先判断数据是否存在;
  2. 如果不存在,则插入:
  3. 如果存在,则更新。

SQL server

脚本先查询,没有数据再进行数据插入,有数据就走更新

  1. if not exists (select 1 from t where id = 1)
  2. insert into t(id, update_time) values(1, getdate())
  3. else
  4. update t set update_time = getdate() where id = 1
  5. 或者
  6. if exists (select 1 from t where id = 1)
  7. insert into t(id, update_time) values(1, getdate())
  8. else
  9. update t set update_time = getdate() where id = 1

mysql

replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中。

  1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。
  2. 否则,直接插入新数据。
    Ps:要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。
  1. ###插入或替换 -- 没有就插入,有就先删除再插入
  2. REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);
  3. 若id=1的记录不存在,REPLACE语句将插入新记录,否则,当前id=1的记录将被删除,然后再插入新记录。
  4. ###插入或更新 -- 如果没有数据就行新增,有数据就更新处理
  5. INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99) ON DUPLICATE KEY UPDATE name='小明', gender='F', score=99;
  6. ###插入或忽略 -- 如果已有id为1的数据本次数据就不会再插入,会忽略本次sql操作
  7. INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);

oracle

脚本先查询,如果有数据表先进行删除操作,然后在进行新增表操作。
同样的,如果是数据,会先查询数据,如果有就进行删除,删除后再进行插入,如果没有就直接进行插入

  1. declare num number;
  2. begin
  3. select count(1) into num from user_tables where table_name='ACCOUNT';
  4. if num > 0 then
  5. dbms_output.put_line('存在!');
  6. execute immediate 'drop table ACCOUNT ';
  7. end if;
  8. execute immediate 'create table Account
  9. (
  10. AccountID nvarchar2(50) primary key,
  11. AccountName nvarchar2(50)
  12. )';
  13. dbms_output.put_line('成功创建表!');
  14. end;

1:隐式游标法 SQL%NOTFOUND SQL%FOUND
SQL%NOTFOUND 是SQL中的一个隐式游标,在增删查改的时候自动打开,如果有至少有一条记录受影响,都会返回false,这就就巧妙的构思出了第一种解决方案:

  1. begin
  2. update account set AccountName = '修改-a' where AccountID = '5';
  3. IF SQL%NOTFOUND THEN
  4. insert into account(AccountID,AccountName) values('5','添加-b');
  5. END IF;
  6. end;
  7. 先根据唯一ID到数据表中修改一条记录,如果这条记录在表中存在,则修改,并且SQL%NOTFOUND返回false。如果修改的记录不存在,SQL%NOTFOUND返回true,并且执行插入语句。

2:异常法 DUP_VAL_ON_INDEX
当Oracle语句执行时,发生了异常exception进行处理,需要唯一索引id,重复插入出现异常

  1. begin
  2. insert into account(AccountID,AccountName) values('6','添加-b');
  3. exception
  4. when DUP_VAL_ON_INDEX then
  5. begin
  6. update account set AccountName = '修改-b' where AccountID = '6';
  7. end;
  8. end;

3:虚拟表法 dual:
dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。

  1. declare t_count number;
  2. begin
  3. select count(*) into t_count from dual where exists(select 1 from account where AccountID='11');
  4. if t_count< 1 then
  5. dbms_output.put_line('添加');
  6. insert into account(AccountID,AccountName) values('11','添加-11');
  7. else
  8. dbms_output.put_line('修改');
  9. update account set AccountName = '修改-11' where AccountID = '11';
  10. end if;
  11. end;

4:no_data_found法
先查找要插入的记录是否存在,存在则修改,不存在则插入。具体的实现如下:

  1. declare t_cols number;
  2. begin
  3. select AccountName into t_cols from account where AccountID = '8';
  4. exception
  5. when no_data_found then begin
  6. --dbms_output.put_line('添加');
  7. insert into account(AccountID,AccountName) values('8','添加-8');
  8. end;
  9. when others then
  10. begin
  11. --dbms_output.put_line('修改');
  12. update account set AccountName = '修改-8' where AccountID = '8';
  13. end;
  14. end;

5:merge法
先来看一下merge的语法,

  1. MERGE INTO table_name alias1
  2. USING (table|view|sub_query) alias2
  3. ON (join condition)
  4. WHEN MATCHED THEN
  5. UPDATE table_name SET col1 = col_val1
  6. WHEN NOT MATCHED THEN
  7. INSERT (column_list) VALUES (column_values);
  8. 模仿
  9. merge into Account t1
  10. using (select '3' AccountID,'肖文博' AccountName from dual) t2
  11. on (t1.AccountID = t2.AccountID)
  12. when matched then
  13. update set t1.AccountName = t2.AccountName
  14. when not matched then
  15. insert values (t2.AccountID, t2.AccountName);
  16. commit;
原文链接:https://blog.csdn.net/wwh1st/article/details/129851614

标签:into,sqlserver,AccountName,插入,mysql,oracle,where,id,AccountID
From: https://www.cnblogs.com/sunny3158/p/17782155.html

相关文章

  • MYSQL判断索引是否存在,不存在则创建索引(亲测可用)
    MYSQL判断索引是否存在,不存在则创建索引(亲测可用)springboot集成flyway管理数据库版本使用存储过程平滑更新系统数据库这是一个不存在就添加索引的例子,若需求是存在则删除微调下面的ifnotexists即可DROPPROCEDUREIFEXISTSadd_index;DELIMITER$CREATEPROCEDUREadd_......
  • 安装MySQL以及Workbench
    MySQL压缩包下载链接安装将安装包解压到本地文件夹,假设为D:/ProgramFiles/MySQL。新增系统环境变量:#直接新建。MYSQL_HOME:D:\ProgramFiles\MySQL#在原Path上新增。Path:%MYSQL_HOME%\bin在D:/ProgramFiles/MySQL下新建文件mysql.ini,并添加如下内容(参考官方文......
  • mysql数据库类型有哪些
    mysql数据库类型有哪些mysql数据库类型有:1、整数类型;2、浮点数类型;3、定点数类型;4、位类型BIT;5、日期与时间类型;6、文本字符串类型;7、ENUM类型;8、SET类型;9、二进制字符串类型;10、JSON类型;11、空间类型。其中,整数类型一共有5种。1、整数类型整数类型一共有5种,包括TINYI......
  • MySQL的几种日志
      重做日志(redolog)redolog(重做日志)是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。比如MySQL实例挂了或宕机了,重启时,InnoDB存储引擎会使用redolog恢复数据,保证数据的持久性与完整性。InnoDB会把“在某个数据页上做了什么修改”记录到重做日志缓存(redologbuffer)里,接着刷......
  • Oracle数据库表空间和角色/用户 权限
    问题1.2.3.https://www.iteye.com/blog/czmmiao-1304934这个特别好4.5.6.https://www.51cto.com/article/158937.html表空间7.创建用户8.表空间9.oracle体系结构详解10.https://zhuanlan.zhihu.com/p/100390025实例、表空间、用户之间的关系11.https://docs.oracle......
  • ☀️Navicat连接Oracle:'ORA-12638: Credential retrieval failed' 解决办法
    前言:我们在使用Navicat连接Oracle数据库的时候,需要oci.dll动态链接库,Navicat16在安装时候已经自带了。我在之前使用一直好好的,就今天需要连一个新项目的Oracle,报错了:ORA-12638:Credentialretrievalfailed',如下:解决:通过同事口中得知,要连接的Oracle版本是:12c(12.2.0.1.0),而我之前......
  • mysql增量备份
    一、备份计划以下是MySQL数据库增量备份的一般计划:创建完整备份:在自动备份计划开始前,先创建一次完整备份。这个备份将包含所有数据和表结构。保存增量备份:在每次备份计划完成后,保存增量备份。这个备份将包含从完整备份之后的所有更改操作。定期清理备份:为了节约磁盘空间,定期......
  • oracle更改实例名和库名
    需要注意的问题:1、生成密码文件的密码不能过弱,orapwdfile=$ORACLE_HOME/dbs/oraw$ORACLE_SIDpassword=111(不行的)TYYYy@1031(可以的)entries=5force=y2、spfile和pfile文件里的*.compatible=.... 中的版本号,要与数据库系统一致,有时会有出入3、那个sql文件里的reusedatabas......
  • mysql导入.cvs
    workbench新建1张表,没有import按钮,原因是没有设置主键将一个字段设置为主键后,即可导入数据将要导入的数据文件改为utf-8的格式,使用记事本打开查看选择文件选择数据库表查看字段与数据是否对应开始导入......
  • Oracle Database 23c 新特性预览
    OracleDatabase23c新特性预览甲骨文云技术2022-11-18999在2022年10月18号的OracleCloudWorld大会上,Oracle宣布了令人期待的OracleDatabase23cBeta版。这是世界领先的融合数据库的最新版本,支持所有数据类型、任意工作负载和多种开发风格。Oracle提出了最新......