几天前有人问我设置了字段的默认值为什么无效呢?查找了一些资料,做了一个总结:
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不要求有含义,以及并发性较高的场景
分享到:
相关推荐
在Oracle数据库中,我们经常需要对现有的表结构进行调整,比如增加新的字段、修改现有字段的属性或数据类型、删除不再使用的字段等。这些操作可以通过`ALTER TABLE`命令来完成。本文将详细介绍如何使用`ALTER TABLE`...
要设置字段的默认值,可以利用`<property>`标签内的`<column>`标签中的`default`属性来实现。下面是一个具体的示例: ```xml <column name="PUB_DATE" default="sysdate()" /> ``` 在这个例子中,`<property>`...
指定了要查询的具体字段,包括列名(COLUMN_NAME)、数据类型(DATA_TYPE)、数据长度(DATA_LENGTH)、数据精度(DATA_PRECISION)、数据比例尺(DATA_SCALE)、是否允许为空(NULLABLE)及默认值(DATA_DEFAULT)...
当你创建一个 Django 模型时,你可以为每个字段(Field)指定不同的属性,包括默认值(default)。默认值是在你创建新对象但没有明确提供字段值时使用的值。 例如,在给定的代码片段中,`SitService` 模型有四个...
根据给定的文件信息,我们将深入探讨“oracle建表修改字段”的核心知识点,包括如何使用SQL语句创建表、定义字段属性以及如何修改现有字段的属性。 ### 创建表(Create Table) 在Oracle中,使用`CREATE TABLE`...
在SQL中,我们可以利用字段默认值来自动填充这些时间戳,从而简化后端代码并减轻服务器处理负担。 在上述描述中,我们看到了如何在SQL中为表添加创建时间和更新时间字段,并设定它们的默认值。下面我们将详细讨论这...
示例代码展示了如何创建一个包含两个`TIMESTAMP`字段的表,并向其中插入具体的时间戳值。例如: ```sql CREATE TABLE test ( T1 TIMESTAMP(6), T2 TIMESTAMP(6) ); ``` 这里的`(6)`表示该时间戳的精度为小数点后六...
在Oracle数据库管理中,对表结构进行修改是一项常见的任务,涉及到添加字段、修改字段属性、删除字段、重命名表或字段、以及注释等操作。以下是对这些操作的详细解析: ### 添加字段 使用`ALTER TABLE`语句可以向...
CREATE TABLE <表名> (字段名 1,数据类型 [列级别约束条件] [默认值], 字段名 2,数据类型 [列级别约束条件] [默认值], …… [表级别约束条件]); 例如,创建一个名为“学生” 的数据表,包含字段“学号”、“姓名...
- `DEFAULT expr`:为字段设置默认值。 **示例**: 创建一个名为`test1`的测试表,包含以下字段: - `eid`:员工ID,数据类型为`NUMBER(10)`。 - `name`:员工姓名,数据类型为`VARCHAR2(20)`。 - `hiredate`:入职...
字段1 nVarChar(50) DEFAULT '默认值', 字段2 ntext, 字段3 datetime, 字段4 money, 字段5 int DEFAULT 0, 字段6 Decimal(12,4) DEFAULT 0, 字段7 image ); ``` #### 二、删除表 (Drop Table) `DROP TABLE`...
`DEFAULT '2'`表示此字段的默认值为`'2'`,而`NOT NULL`则指明该字段不允许为空。 #### 2. 删除一列 如果需要删除某个字段,可以使用如下命令: ```sql ALTER TABLE table_name DROP COLUMN column_name; ``` 在...
本篇文章将详细介绍如何利用Oracle中的`ALTER TABLE`命令来修改表结构,包括添加字段、修改字段、删除字段、重命名表以及添加注释等功能。 #### 二、添加字段 添加字段是最常见的需求之一,通常用于扩展已有表的...
默认约束为字段提供了默认值,当插入新记录且未指定该字段值时,将自动使用默认值。添加默认约束:`ALTER TABLE table1 ADD DEFAULT '默认值' FOR 列名` 在实际数据库设计中,这些约束的组合使用能够确保数据的...
可以设置默认值和约束,如`DEFAULT`和`UNIQUE`、`PRIMARY KEY`。 2. **ALTER**: 修改已有对象。可以改变表名、添加字段、修改字段定义、添加约束等。如: - 改表名:`ALTER TABLE 表名 1 TO 表名 2;` - 增字段:`...
- `TRUNCATE`操作速度快,因为它直接删除表的所有数据并重置自增字段。 - **DB2**: - 使用`ALTER TABLE TableName ACTIVE NOT LOGGED INITIALLY WITH EMPTY TABLE;` - 这个操作在DB2中也能高效地清空表。 #### ...
需要注意的是,若被删除字段中已有数据,或你尝试减少字段宽度导致已有数据无法容纳,Oracle会抛出错误,如`ORA-01441`。 高级用法中,可以使用`RENAME`来改变表名或列名: - 重命名表:`ALTER TABLE table_name ...
根据提供的文件信息,本文将详细解释如何在Oracle数据库中使用`LAG`函数来获取同一字段的前N行数据,以及如何使用`LEAD`函数获取后N行的值。 ### Oracle LAG 和 LEAD 函数简介 #### 1. LAG 函数 `LAG`函数是Oracle...
可为字段设置默认值,如`DEFAULT SYSDATE`,并添加约束,如`UNIQUE`和`PRIMARY KEY`。 - ALTER:改变已有的对象,包括更改表名、添加字段、修改字段定义、添加约束以及控制表的缓存策略。 在执行DML和DDL语句时,...
- 表结构包含了数据库中表的各个字段的详细信息,如字段名(如`Name`)、字段描述(如`Description`)、字段类型(如`Type`)、字段长度(如`Size`)、是否可为空(如`IsNULL`)和默认值(如`DefaultValue`)。...