null怎么insert oracle,Oracle:如果行不存在,如何INSERT
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相关推荐
- ORACLE ROWNUM用法、select into与insert into区别、merge into的使用、递归查询
ROWNUM用法 ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<. ...
- oracle的insert写法,oracle中的insert语句
关键字: ORACLE insert into table oracle中的insert语句 在oracle中使用DML语言的insert语句来向表格中插入数据,先介绍每次只能插入一条数据的语法 IN ...
- Oracle锁表 行级锁 表级锁 行级锁
2019独角兽企业重金招聘Python工程师标准>>> Oracle锁表 行级锁 表级锁 ---- 行被排他锁定 ----在某行的锁被释放之前,其他用户不能修改此行 ...
- oracle insert 数组,oracle 数组 批量insert
场景:[转]jdbc批量insert---oracle数组类型与forall的使用 [转]jdbc批量insert---oracle数组类型与forall的应用 原文:http://blog.itpu ...
- oracle更新行,Oracle更新多行
Oracle更新多行 更新多行的步骤: 步骤多,但效率比较高: 1.create table 临时表 value (select a.id,a.name,b.name,... from table1 ...
- oracle sql命令行中上下左右使用
oracle sql命令行中上下左右使用 yum -y install readline,rlwrap 配置环境变量 alias sqlplus='rlwrap sqlplus' 测试 posted ...
- Oracle(三)多行函数
Oracle(三)多行函数 --多行函数 select count(1) from emp;--查询总数量 select sum(sal) from emp;--工资总和 select max(sal ...
- oracle起监听命令,lsnrctl oracle 监听器 命令行 操作命令 lsnrctl services
评论 # re: lsnrctl oracle 监听器 命令行 操作命令 lsnrctl services 2009-06-29 22:15 gddg 邪门的 错误 用360 kill 占用 1521 ...
- num_rows为NULL时,进行Oracle收集统计信息
对数据库进行导入导出或者数据发生变更,可能导致num_rows都为null,所以需要Oracle去收集统计信息,使得num_rows字段有数据 Oracle中的统计信息 使用DBMS_STATS.GA ...
- oracle SQL 命令行(二.视图(2))
创建视图的时候使用 with check option 语句 保证插入和修改操作时视图只有年龄为22的学生. SQL> connect system/lixiang666; 已连接. SQL&g ...
最新文章
- an导入html5,H5-FLASH:AN HTML5-BASED FLASH RUNTIME
- 字符设备驱动0:一个简单但完整的字符设备驱动程序
- oracle move 换用户,Oracle move方法释放delete后的表空间
- 学习C/C++:伴随我成长的编程书!
- c# url编码 字母编码_我如何通过每天30分钟编码来完成#100DaysOfCode挑战
- php foreach bcc,php – 无法通过Mandrill发送BCC电子邮件(通过Laravel)
- 域环境安装企业从属CA两种方法
- 论文阅读笔记:ShuffleNet
- 联邦学习数学公式纯手推
- 95-后程序员一出校门就拿年薪-30多万?,2021Android面试笔试总结
- 风暴数码论坛教程-JAVA环境配置
- 手机视频投屏到电视或投影仪
- 计算机考研一志愿不满,【建议收藏】40所不歧视本科 保护一志愿院校 内含大量985/211!...
- Notion学习笔记(一):用Notion写markdown
- 打破校史!「双非」高校,首发 Science
- 电影暗杀了一只巨可爱的猫[转帖]
- 教授专栏01 | 汪扬:元宇宙助香港,新经济创未来
- java 生成纯色图片_canvas简单实现纯色背景图片抠图(示例代码)
- 如何破解加密ppt文档的密码
- 2020最新各大网站软件提交入口,软件发布入口汇总
热门文章
- Win7系统做路由器
- ADO.NET Entity Framework 4.1 中的代码优先
- WPF基础之体系结构
- 扇贝有道180925每日一句
- Atitit io读取文件法 目录 1. 文件法	1 1.1. 异步读取文件:	1 1.2. 2.同步读取方法	1 1.3. 二进制读文件:	1 2. 读取api规范	1 3. Atitit 按照
- Atitit 深入了解UUID含义是通用唯一识别码 (Universally Unique Identifier),
- atitit.压缩算法 ZLib ,gzip ,zip 最佳实践 java .net php
- paip.判断文件是否存在uapi python php java c#
- paip.VS2010未能加载类型
- 在没有源代码的情况下调试JAR包..