INSERT INTO table SELECT 'jonny', NULL FROM dual -- Not Oracle? No need for dual, drop that line WHERE NOT EXISTS (SELECT NULL -- canonical way, but you can select -- anything as EXISTS only checks existence FROM table WHERE name = 'jonny' )

假设你在10g上,你也可以使用MERGE语句。 这允许您插入行,如果它不存在,并忽略该行,如果它存在。 当他们想要做一个“upsert”的时候,人们往往会想到MERGE(INSERT如果该行不存在,UPDATE如果该行存在),但UPDATE部分现在是可选的,所以它也可以在这里使用。

SQL> create table foo ( 2 name varchar2(10) primary key, 3 age number 4 ); Table created. SQL> ed Wrote file afiedt.buf 1 merge into foo a 2 using (select 'johnny' name, null age from dual) b 3 on (a.name = b.name) 4 when not matched then 5 insert( name, age) 6* values( b.name, b.age) SQL> / 1 row merged. SQL> / 0 rows merged. SQL> select * from foo; NAME AGE ---------- ---------- johnny

如果名字是一个PK,那么插入并捕获错误。 这样做而不是任何检查的原因是即使多个客户端同时插入,它也可以工作。 如果您检查并插入,那么您必须在此期间持有锁,或者预期错误。

这个代码会是这样的

BEGIN INSERT INTO table( name, age ) VALUES( 'johnny', null ); EXCEPTION WHEN dup_val_on_index THEN NULL; -- Intentionally ignore duplicates END;

使用@benoit的部分答案,我将使用这个:

DECLARE varTmp NUMBER:=0; BEGIN -- checks SELECT nvl((SELECT 1 FROM table WHERE name = 'john'), 0) INTO varTmp FROM dual; -- insert IF (varTmp = 1) THEN INSERT INTO table (john, null) END IF; END;

对不起,我没有使用任何完整的给定的答案,但我需要IF检查,因为我的代码比这个名称和年龄字段的示例表复杂得多。 我需要一个非常明确的代码。 非常感谢,我学到了很多! 我会接受@benoit的答案。

我发现这些例子有点棘手,需要确保目标表中存在一行(特别是当您有两列作为主键时),但主键可能根本就不存在,所以没有任何东西select。

这对我来说是有效的:

MERGE INTO table1 D USING ( -- These are the row(s) you want to insert. SELECT 'val1' AS FIELD_A, 'val2' AS FIELD_B FROM DUAL ) S ON ( -- This is the criteria to find the above row(s) in the -- destination table. S refers to the rows in the SELECT -- statement above, D refers to the destination table. D.FIELD_A = S.FIELD_A AND D.FIELD_B = S.FIELD_B ) -- This is the INSERT statement to run for each row that -- doesn't exist in the destination table. WHEN NOT MATCHED THEN INSERT ( FIELD_A, FIELD_B, FIELD_C ) VALUES ( S.FIELD_A, S.FIELD_B, 'val3' )

关键是:

USING块内的SELECT语句必须总是返回行。 如果没有从此查询返回的行,则不会插入或更新行。 在这里,我从DUALselect,总是只有一行。

ON条件是设置匹配行的条件。 如果ON没有匹配,则运行INSERT语句。

如果您还想更多地控制更新,也可以添加WHEN MATCHED THEN UPDATE子句。

除了迄今给出的完美和有效的答案之外,还有您可能想要使用的ignore_row_on_dupkey_index提示:

create table tq84_a ( name varchar2 (20) primary key, age number ); insert /*+ ignore_row_on_dupkey_index(tq84_a(name)) */ into tq84_a values ('Johnny', 77); insert /*+ ignore_row_on_dupkey_index(tq84_a(name)) */ into tq84_a values ('Pete' , 28); insert /*+ ignore_row_on_dupkey_index(tq84_a(name)) */ into tq84_a values ('Sue' , 35); insert /*+ ignore_row_on_dupkey_index(tq84_a(name)) */ into tq84_a values ('Johnny', null); select * from tq84_a;

提示在大溪地描述。

你可以使用这个语法:

INSERT INTO table_name ( name, age ) select 'jonny', 18 from dual where not exists(select 1 from table_name where name = 'jonny');

如果它打开一个popup询问为“input替代variables”,然后在上述查询之前使用此:

set define off; INSERT INTO table_name ( name, age ) select 'jonny', 18 from dual where not exists(select 1 from table_name where name = 'jonny');

CTE和只有CTE

null怎么insert oracle,Oracle:如果行不存在,如何INSERT相关推荐

  1. ORACLE ROWNUM用法、select into与insert into区别、merge into的使用、递归查询

    ROWNUM用法 ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<. ...

  2. oracle的insert写法,oracle中的insert语句

    关键字: ORACLE insert into table oracle中的insert语句 在oracle中使用DML语言的insert语句来向表格中插入数据,先介绍每次只能插入一条数据的语法 IN ...

  3. Oracle锁表 行级锁 表级锁 行级锁

    2019独角兽企业重金招聘Python工程师标准>>> Oracle锁表  行级锁  表级锁 ---- 行被排他锁定 ----在某行的锁被释放之前,其他用户不能修改此行       ...

  4. oracle insert 数组,oracle 数组 批量insert

    场景:[转]jdbc批量insert---oracle数组类型与forall的使用 [转]jdbc批量insert---oracle数组类型与forall的应用 原文:http://blog.itpu ...

  5. oracle更新行,Oracle更新多行

    Oracle更新多行 更新多行的步骤: 步骤多,但效率比较高: 1.create table 临时表 value (select a.id,a.name,b.name,... from table1 ...

  6. oracle sql命令行中上下左右使用

    oracle sql命令行中上下左右使用 yum -y install readline,rlwrap 配置环境变量 alias sqlplus='rlwrap sqlplus' 测试 posted ...

  7. Oracle(三)多行函数

    Oracle(三)多行函数 --多行函数 select count(1) from emp;--查询总数量 select sum(sal) from emp;--工资总和 select max(sal ...

  8. oracle起监听命令,lsnrctl oracle 监听器 命令行 操作命令 lsnrctl services

    评论 # re: lsnrctl oracle 监听器 命令行 操作命令 lsnrctl services 2009-06-29 22:15 gddg 邪门的 错误 用360 kill 占用 1521 ...

  9. num_rows为NULL时,进行Oracle收集统计信息

    对数据库进行导入导出或者数据发生变更,可能导致num_rows都为null,所以需要Oracle去收集统计信息,使得num_rows字段有数据 Oracle中的统计信息 使用DBMS_STATS.GA ...

  10. oracle SQL 命令行(二.视图(2))

    创建视图的时候使用 with check option 语句 保证插入和修改操作时视图只有年龄为22的学生. SQL> connect system/lixiang666; 已连接. SQL&g ...

最新文章

  1. an导入html5,H5-FLASH:AN HTML5-BASED FLASH RUNTIME
  2. 字符设备驱动0:一个简单但完整的字符设备驱动程序
  3. oracle move 换用户,Oracle move方法释放delete后的表空间
  4. 学习C/C++:伴随我成长的编程书!
  5. c# url编码 字母编码_我如何通过每天30分钟编码来完成#100DaysOfCode挑战
  6. php foreach bcc,php – 无法通过Mandrill发送BCC电子邮件(通过Laravel)
  7. 域环境安装企业从属CA两种方法
  8. 论文阅读笔记:ShuffleNet
  9. 联邦学习数学公式纯手推
  10. 95-后程序员一出校门就拿年薪-30多万?,2021Android面试笔试总结
  11. 风暴数码论坛教程-JAVA环境配置
  12. 手机视频投屏到电视或投影仪
  13. 计算机考研一志愿不满,【建议收藏】40所不歧视本科 保护一志愿院校 内含大量985/211!...
  14. Notion学习笔记(一):用Notion写markdown
  15. 打破校史!「双非」高校,首发 Science
  16. 电影暗杀了一只巨可爱的猫[转帖]
  17. 教授专栏01 | 汪扬:元宇宙助香港,新经济创未来
  18. java 生成纯色图片_canvas简单实现纯色背景图片抠图(示例代码)
  19. 如何破解加密ppt文档的密码
  20. 2020最新各大网站软件提交入口,软件发布入口汇总

热门文章

  1. Win7系统做路由器
  2. ADO.NET Entity Framework 4.1 中的代码优先
  3. WPF基础之体系结构
  4. 扇贝有道180925每日一句
  5. Atitit io读取文件法 目录 1. 文件法 1 1.1. 异步读取文件: 1 1.2. 2.同步读取方法 1 1.3. 二进制读文件: 1 2. 读取api规范 1 3. Atitit 按照
  6. Atitit 深入了解UUID含义是通用唯一识别码 (Universally Unique Identifier),
  7. atitit.压缩算法 ZLib ,gzip ,zip 最佳实践 java .net php
  8. paip.判断文件是否存在uapi python php java c#
  9. paip.VS2010未能加载类型
  10. 在没有源代码的情况下调试JAR包..