`
yelr_j
  • 浏览: 67513 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

oracle 设置默认值无效(转)

 
阅读更多

几天前有人问我设置了字段的默认值为什么无效呢?查找了一些资料,做了一个总结:
-->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支持两种方式:
1. Default关键字
2. 不指定列
先看第一种方式,

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


列A终于有了默认值0。
再看第二种方式,
 -->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的字段。
可以将下面的系统属性作为默认值:
1. SYSDATE:系统时间
2.SYS_CONTEXT:系统上下文
3.USER:当前数据库用户
4.USERENV:用户环境变量,可以获取一些IP地址、协议、终端的信息
需要注意,默认值不能使用LEVEL、PRIOR、ROWNUM,会报ORA-00976错误。
应用中使用默认值的常见场景是主键或自增列。正如我们所知,Oracle并未提供自增类型,这就需要我们结合默认值进行二次开发,通过默认值实现系统应用的透明。这里结合笔者的经验,提供两种方案:
 触发器+序列
因为Oracle不支持在default中使用序列,因此我们只能使用触发器来实现。
-->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位长的数据库全局唯一标识。我们可以使用这个函数作为默认值。
 -->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不要求有含义,以及并发性较高的场景

 

转自:http://blog.csdn.net/ethan_novice/article/details/8075992

分享到:
评论

相关推荐

    Navicat Premium (为什么不能设置0 分的资源)

    Navicat Premium是一款非常流行的数据库管理工具,专为多种数据库管理系统设计,包括MySQL、SQL Server、Oracle、PostgreSQL等。这款软件提供了直观的图形界面,让用户可以方便地进行数据库连接、数据查询、数据编辑...

    oracle9i全备份导入到11g说明

    由于Oracle 11g的`db_block_size`默认值固定为8192(即8K),且该参数在创建数据库后无法直接修改,可以通过调整其他相关参数来变通处理。具体做法如下: - 使用`alter system set db_16k_cache_size=16384`语句来...

    Windows Server 2016 Oracle 12C安装连接的若干问题处置方法

    ### Windows Server 2016 上 Oracle 12C 安装及连接问题处置方法 #### 一、概述 在Windows Server 2016环境下部署Oracle 12C数据库时,由于版本更新带来的变动较大,加之缺乏相关维护经验,可能会遇到一系列连接...

    oracle错误中文解释

    - **解释**:这表示系统参数'mts_dispatchers'设置无效。 ### 00102,0,"ʹÉ'%s'" - **含义**:使用了无效的选项。 - **解释**:这表示使用了无效的选项。 ### 00103,0,"ЧÉ;Ϊȳʹ" - **含义**:无效的选项;为...

    Oracle初始化参数

    - **默认值**:`ORACLE_HOME/rdbms/log`(根据操作系统而定) #### 九、background_tape_io_slaves - **参数名**:background_tape_io_slaves - **类别**:备份和恢复 - **说明**: - 一个Recovery Manager参数,...

    Oracle中的sqlldr用法.doc

    参数load指定了要加载的记录数,如果加载的记录数不同于数据文件中的记录数,那么该参数将无效。 errors 参数errors指定了允许的错误记录数,超过该值将终止加载任务。 rows 参数rows指定了绑定数组中的行数,如果...

    Oracle9i初始化参数中文说明.doc

    Oracle9i 初始化参数中文说明 Oracle9i 初始化参数是数据库管理员控制数据库行为的重要工具。正确地设置这些参数可以提高数据库的性能和安全性。...除非 MTS_MULTIPLE_LISTENERS 参数为 TRUE,否则该参数无效。

    oracle10g初始化参数说明.doc

    如果设置为 TRUE,它允许具有 SYSTEM 权限的用户不受限制地访问 SYS 方案中的对象,类似于 Oracle7 的行为。若设置为 FALSE,只有拥有 SELECT_CATALOG_ROLE、EXECUTE_CATALOG_ROLE 或 DELETE_CATALOG_ROLE 角色的...

    Oracle数据库错误消息

    - **错误描述**:在处理默认值审计选项时,Oracle遇到错误。 - **解决方案**:检查审计配置,确保其正确且与数据库兼容。 ### EXP-00017 需要字符串特征,但数据库中没有给出 - **错误描述**:执行的命令需要特定...

    oracle数据库

    EXP-00016 当读默认值审核选项时,ORACLE遇到错误 **原因**:在读取默认审核选项时出现了Oracle错误。 **操作指南**: - **查阅Oracle错误**:参考Oracle官方文档来了解具体的错误含义,并采取相应措施。 #### 18...

    oracle10g初始化参数说明

    如果设置为 `TRUE`,它允许具有 `SYSTEM` 权限的用户不受限制地访问 `SYS` 方案中的对象,类似于 Oracle7 的行为。而如果设置为 `FALSE`,只有被授予了 `SELECT_CATALOG_ROLE`, `EXECUTE_CATALOG_ROLE`, 和 `DELETE_...

    Oracle数据库错误消息.pdf

    17. EXP-00016:读默认值审核选项时出错。查阅Oracle错误并采取相应措施。 18. EXP-00017:需要的特性未提供。确认已安装Oracle特性或更新V$OPTION表。 19. EXP-00018:不支持的数据类型。使用Oracle支持的数据...

    ORACLE ORA

    - **ORA-02276**:表示无法设置默认值。 - **ORA-02277**:表示列选项不正确。 - **ORA-02278**:表示ORDER和NOORDER选项冲突。 - **ORA-02279**至**ORA-02282**:表示ORDER和NOORDER选项冲突。 - **ORA-02283**:...

    oracle初始化参数

    设置为1表示仅有一个主实例,大于集群实例数的值无效。如果没有设定,默认情况下,所有实例都是活动的。 3. **aq_tm_processes**: 这个参数与消息队列有关。当其值大于0时,启用消息延迟和失效时间监控,这对开发...

    BLOG_Oracle_lhr_用户密码系列.pdf

    Profile是Oracle中用于设置口令限制和资源限制的一组参数。默认Profile为`DEFAULT`,创建用户时未指定Profile则会分配此默认值。通过`SELECT * FROM DBA_PROFILES WHERE PROFILE = 'DEFAULT' AND (RESOURCE_NAME ...

    oracle约束键解析.docx

    首先,数据库约束是数据库模式设计中的重要因素,它们限制了数据的输入方式,防止了无效数据的录入。例如,主键和唯一约束用于防止数据重复,检查约束规定了数据的允许范围,而默认约束则为字段提供了预设的默认值。...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第2/2部分)

    3.1 设置数据库初始化参数 82 3.1.1 静态参数和动态参数以及初始化参数文件 82 3.1.2 基本参数 84 3.2 描述启动和关闭数据库时的多个阶段 88 3.2.1 Database Control的启动和连接 88 3.2.2 启动数据库侦听器 ...

    oracle资源有关于oracle10存储过程

    - 编译:通过 `ALTER PROCEDURE COMPILE` 命令重新编译,解决因引用对象变化导致的无效状态。 - 查询:可以使用 SQL 查询 `USER_OBJECTS` 和 `USER_SOURCE` 表来查看存储过程的状态和源代码。 3. **调用存储过程*...

Global site tag (gtag.js) - Google Analytics