`

oracle default 字段默认值无效

 
阅读更多
几天前有人问我设置了字段的默认值为什么无效呢?查找了一些资料,做了一个总结:
 


Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->create table TEST
(
ID VARCHAR2(64),
A  VARCHAR2(3) default '0',
NAME VARCHAR2(100)
);
SQL> insert into test(a,name) values(null,'test');
1 row inserted
SQL> select * from test;
A   NAME
--- --------------------------------------------------------------------------------
    test


在上面的例子中,虽然A列设置了默认值为0,但插入空仍然无效。
其实对于默认值,Oracle支持两种方式:
? Default关键字
? 不指定列
先看第一种方式,



Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->SQL> insert into test(a,name) values(default,'test');
1 row inserted
SQL> select * from test;
A NAME
--- --------------------------------------------------------------------------------
0 test


列A终于有了默认值0。
再看第二种方式,



Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->SQL> insert into test2(name) values('test');
1 row inserted

SQL> select * from test2;
A NAME
--- --------------------------------------------------------------------------------
0 test



列A也被添加的默认值。
综上所述,Oracle的默认值处理要当心,如果应用中使用的是ORM工具,则必须要考虑对于字段为Null的处理,必要时在ORM工具中将Null转换为default或插入时去掉值为Null的字段。
可以将下面的系统属性作为默认值:
? SYSDATE:系统时间
? SYS_CONTEXT:系统上下文
? USER:当前数据库用户
? USERENV:用户环境变量,可以获取一些IP地址、协议、终端的信息
需要注意,默认值不能使用LEVEL、PRIOR、ROWNUM,会报ORA-00976错误。
应用中使用默认值的常见场景是主键或自增列。正如我们所知,Oracle并未提供自增类型,这就需要我们结合默认值进行二次开发,通过默认值实现系统应用的透明。这里结合笔者的经验,提供两种方案:
? 触发器+序列
因为Oracle不支持在default中使用序列,因此我们只能使用触发器来实现。



Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->create table TEST
(
ID VARCHAR2(64),
A VARCHAR2(3) default '0',
NAME VARCHAR2(100)
);
create sequence seq_test;
create or replace trigger tri_test
before insert on test for each row
begin
if :new.id is null then
select seq_test.nextval into :new.id from dual;
end if;
end;
/


这种方式适用于对于ID不要求连续性的场景。
? Sys_guid()。这个函数返回32位长的数据库全局唯一标识。我们可以使用这个函数作为默认值。



Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->alter table TEST modify ID default sys_guid()
SQL> insert into test2(name) values('张三');
1 row inserted
SQL> select * from test2;
ID A NAME
---------------------------------------------------------------- --- --------------------------------------------------------------------------------
7CDB1AF556F6474FABA74FA7A60F0822 0 张三

这种方式适用于ID不要求有含义,以及并发性较高的场景
分享到:
评论

相关推荐

    SQL | 创建时间,更新时间,使用默认值自动设置|data-412945.pdf

    在数据库表设计中,经常会使用到创建时间字段和更新时间字段,我们可以为表中的字段设置相应的默认值,实现添加数据时创建时间字段的值自动为当前创建该数据的时间,更新数据时更新时间字段的值自动为当前更新该数据...

    最全的oracle常用命令大全.txt

    SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select * from user_role_privs; 查看当前用户的系统权限和表级权限 SQL>select * from user_sys_privs; SQL>select * ...

    Oracle9i的init.ora参数中文说明

    说明: 指定一个字符串值, 设置 TIME 数据类型的默认值, 该数据类型包含 HOUR, MINUTE 和 SECOND 这几个日期时间字段。 语法: TIME '09:26:50' (将值存储为 7 个字节)。 默认值: 从 NLS_TERRITORY 中获得 nls_time...

    oracle学习笔记(三)

    [,column …]) default 约束 说明略 2、利用子查询创建表 create table 表名 as select * from u表 二、修改表 1、添加一个新列 oracle:alter table table_name add(column datatype [default expr][,column ...

    将Oracle中的表结构导出到word

    语句如下:  SELECTt1.Table_NameAS"表名称",  t3.commentsAS"表说明", ...  t1.Data_Default"默认值"  FROMcolst1leftjoinuser_col_commentst2  ont1.Table_name=t2.Table_nameandt1.Column_Name=

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    选择安装路径,选择数据库版本(企业版),选择字符集(默认值) 填写全局数据库名,管理口令 6. 步骤5/8:先决条件检查 如果你的电脑满足要求但仍然显示检查失败,这时候直接忽略,勾选全部忽略 7. 步骤6/8:概要信息...

    orcale常用命令

    SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select * from user_role_privs; 查看当前用户的系统权限和表级权限 SQL>select * from user_sys_privs; SQL>select * ...

    mysql基础只是总结

    3、默认值default 4、主键primary key 5、列值的唯一 unqiue 6、索引 index|key 7、前导0 zerofill 属性可以写在末尾的主键 列值唯一 索引 4、查看表 desc 表名 show columns from 表名 show columns in ...

    精通sql结构化查询语句

    12.5.1 创建默认值 12.5.2 默认值的绑定与松绑 12.6 小结第5篇 T-SQL高级编程篇第13章 存储过程 13.1 存储过程概述 13.1.1 存储过程的基本概念 13.1.2 存储过程的优缺点 13.2 存储过程中常用的流控制语句 13.2.1 IF....

    PL/SQL 基础.doc

    Var_name [CONSTANT](标识常量,可选) type [NOT NULL] [ default value](赋值,初始化)等同于上面的语句; 注:1) 申明时可以有默认值也可以没有; 2) 如有[CONSTANT][NOT NULL], 变量一定要有一个初始值; 3) ...

    mysql数据库的基本操作语法

    --普通长度文本,default设置默认值 uName varchar(255) default ‘zhangsan’, --超长文本 uRemark text, --图片 uPhoto blob, --日期 uBirthday datetime ); 8、 子查询建表方法 部分列名匹配模式: create ...

    SQL培训第一期

    default约束:默认值约束。 check约束:检查约束,check约束通过约束条件表达式设置列值应该满足的条件。 1.5 范式 1.5.1 第一范式 1.5.1.1 规范 无重复的列,确保每列保持原子性,即数据库表中的所有字段值都是不可...

    jpivot学习总结.doc

    <jp:mondrianQuery dataSource="" id="query01" jdbcDriver="oracle.jdbc.driver.OracleDriver" jdbcUrl="jdbc:oracle:thin:ngykt/ngyktadmin@172.16.46.241:1521:orcl10" catalogUri="/WEB-INF/queries/feeSchema....

Global site tag (gtag.js) - Google Analytics