《.Net程序员学用Oracle系列:导航目录》

本文大纲

据说 Oracle 中表的类型有 9 种,但实际应用中 99% 以上的情况下用的可能都是堆组织表,也就是我们常说的“普通”表。执行普通 CREATE TABLE 语句时,默认得到的表就是堆组织表。表是数据库中一个非常重要的对象,是其他对象的基础。数据库只是一个框架,表才是其实质内容。本文内容将围绕表及表相关的 SQL 操作展开。

创建表

如要创建一张课程表,字段包含:课程ID、课程名称、课程描述。示例:

  1. CREATE TABLE t_course(
  2. course_id NUMBER(10) PRIMARY KEY,
  3. course_name VARCHAR2(50),
  4. course_desc VARCHAR2(2000)
  5. );

如要创建一张只包含职员姓名和生日的表,示例:

  1. CREATE TABLE t_staff_mini AS
  2. SELECT t1.staff_id, t1.birthday FROM t_staff t1;

如要创建一张只包含 90 后员工数据的职员表,示例:

  1. CREATE TABLE t_staff90 AS
  2. SELECT * FROM t_staff t1 WHERE t1.birthday>=TO_DATE('1990-01-01','yyyy-mm-dd');

上面的示例已经两次用到根据已有表创建一张新表的语法——“CREATE TABLE ... AS SELECT * FROM ... WHERE ...”(T-SQL 中类似的语法是select field1,field2 into tableA from tableB),关于这个语法有两点需要注意:

  • 只创建表结构并拷贝表数据,不拷贝任何约束。
  • 当 WHERE 条件不成立时,只创建表结构,不拷贝表数据。

修改表 & 删除表

将表名从 t_staff_mini 改成 t_staff2,示例:

  1. ALTER TABLE t_staff_mini RENAME TO t_staff2;

删除 t_staff90 表,示例:

  1. DROP TABLE t_staff90;

字段

添加字段

t_staff2 表中添加 is_disabled 字段,默认值 0,表示职员未被禁用,即启用状态,示例:

  1. ALTER TABLE t_staff2 ADD(is_disabled NUMBER(1) DEFAULT(0)); -- DEFAULT 的括号可以省略

t_staff 表中添加性别、身高和体重 3 个字段,写三条语句分别来添加当然是可以的,但 Oracle 提供了更简洁的语法,示例:

  1. ALTER TABLE t_staff2 ADD(gender NUMBER(1), height NUMBER(4,1), weight NUMBER(4,1));

修改字段 & 删除字段

t_staff 表中的 is_disabled 字段的字段名改为 staff_status,示例:

  1. ALTER TABLE t_staff2 RENAME COLUMN is_disabled TO staff_status;

t_staff 表中的 gender 字段的数据类型改为 VARCHAR2,示例:

  1. ALTER TABLE t_staff2 MODIFY(gender VARCHAR2(10)); -- MODIFY 的括号可以省略

t_staff 表中的 gender 字段的数据类型长度扩大 5 倍,示例:

  1. ALTER TABLE t_staff2 MODIFY(gender VARCHAR2(50));

t_staff 表中的 staff_status 字段的默认值改为字符串 1,示例:

  1. ALTER TABLE t_staff2 MODIFY(staff_status DEFAULT('1'));

删除 t_staff 表中的 gender 字段,示例:

  1. ALTER TABLE t_staff2 DROP(gender);

删除 t_staff 表中的身高和体重两个字段,与添加多个字段同理,示例:

  1. ALTER TABLE t_staff2 DROP(height,weight);

注释

表注释

表注释的语法有且只有一种写法,示例:

  1. COMMENT ON TABLE table_name IS '注释内容';

如要给 t_staff 表添加注释,示例:

  1. COMMENT ON TABLE t_staff IS '职员表';
  2. COMMENT ON TABLE t_staff IS ''; -- 清空 t_staff 表的注释,可利用这个思路实现删改表注释的效果

字段注释

字段注释的语法有且只有一种写法,示例:

  1. COMMENT ON COLUMN t_staff.staff_name IS '职员姓名';
  2. COMMENT ON COLUMN t_staff.staff_name IS ''; -- 清空 staff_name 字段的注释,可利用这个思路实现删改字段注释的效果

约束

数据的完整性用于确保数据库数据遵从一定的商业和逻辑规则。在 Oracle 中数据完整性可以通过约束、触发器、存储过程、函数等方式来实现,而约束易于维护,并且具有最好的性能,一般作为确保数据完整性的首选。

添加主键约束

要求给 t_staff_copy 表添加一个主键,主键字段为 staff_id,示例:

  1. ALTER TABLE t_staff_copy ADD CONSTRAINT pk_staff_copy PRIMARY KEY(staff_id);

如要根据职员姓名和性别创建一个联合主键,示例:

  1. ALTER TABLE t_staff_copy DROP CONSTRAINT pk_staff_copy; -- 表只能有一个主键,所以要先把刚才建的主键删除掉
  2. ALTER TABLE t_staff_copy ADD CONSTRAINT pk_staff_copy PRIMARY KEY(staff_name,gender);

实际开发中一般都会给表设置主键,而且大部分都是在创建表的时候一块儿创建,示例:

  1. -- 语法一
  2. CREATE TABLE t_staff3(
  3. staff_id NUMBER(10) PRIMARY KEY,
  4. staff_name VARCHAR2(20)
  5. );
  6. -- 语法二
  7. CREATE TABLE t_staff4(
  8. staff_id NUMBER(10),
  9. staff_name VARCHAR2(20),
  10. CONSTRAINT pk_staff4 PRIMARY KEY(staff_id)
  11. );

添加外键约束

关于外键约束有两个需要注意的概念,分别是级联更新和级联删除,简单的说就是当主表中数据删除后,会同步更新或删除从表中的数据。在 Oracle 里删除有外键约束的主表数据,会有以下三种情况之一发生:

  • 1、禁止删除,也是 Oracle 默认行为。
  • 2、参照主表把从表中对应的数据一同删除。适合强耦合关系。
  • 3、参照主表把从表中对应的数据设置为空。适合弱耦合关系。

第 1 种情况示例:

  1. ALTER TABLE t_field_enum ADD CONSTRAINT fk_field_code FOREIGN KEY(field_code) REFERENCES t_field(field_code);

第 2 种情况示例:

  1. ALTER TABLE t_field_enum DROP CONSTRAINT fk_field_code; -- 对同一个字段只能建一个外键,所以要先把刚才建的外键删除掉
  2. ALTER TABLE t_field_enum ADD CONSTRAINT fk_field_code FOREIGN KEY(field_code) REFERENCES t_field(field_code) ON DELETE CASCADE;

第 3 种情况示例:

  1. ALTER TABLE t_field_enum DROP CONSTRAINT fk_field_code;
  2. ALTER TABLE t_field_enum ADD CONSTRAINT fk_field_code FOREIGN KEY(field_code) REFERENCES t_field(field_code) ON DELETE SET NULL;

添加唯一约束

唯一约束的作用就是确保表字段的值不会重复,示例:

  1. ALTER TABLE t_staff ADD CONSTRAINT uk_staff_name UNIQUE(staff_name);

添加 CHECK 约束

CHECK 约束允许对表字段做更个性化的约束以满足业务需要,比如限定性别只能是 1(男)和 0(女),示例:

  1. ALTER TABLE t_staff ADD CONSTRAINT ck_gender CHECK(gender IN(0,1));

非空约束

非空约束比较特殊,其作用就是限制表字段必填,添加非空约束的示例:

  1. ALTER TABLE t_staff2 MODIFY(staff_status NOT NULL); -- 如要去掉非空约束,去掉 NOT 再执行一次即可

禁用约束 & 启用约束 & 删除约束

除非空约束比较特殊以外,其它约束的启用、禁用和删除语法都以一样的。示例:

  1. ALTER TABLE t_staff DISABLE CONSTRAINT uk_staff_name; -- 禁用 uk_staff_name 约束
  2. ALTER TABLE t_staff ENABLE CONSTRAINT uk_staff_name; -- 启用 uk_staff_name 约束
  3. ALTER TABLE t_staff RENAME CONSTRAINT uk_staff_name TO uk_test; -- 将约束名从 uk_staff_name 改成 uk_test
  4. ALTER TABLE t_staff DROP CONSTRAINT uk_test; -- 删除 uk_staff_name 约束

索引

索引其实是一个很大的话题,大型应用这块儿工作主要由 DBA 来完成,还有些索引 Oracle 会自动创建(比如创建主键时会自动创建基于主键字段的唯一索引,创建唯一约束时会创建基于约束字段的唯一索引),这里仅介绍创建、禁用和删除索引的语法,作为普通开发人员知道这些已经够了。

创建索引

索引一般是根据业务查询条件来创建的,常见的 Oracle 索引创建语法示例:

  1. CREATE INDEX idx_manager_id ON t_staff(manager_id); -- 创建标准/普通索引
  2. CREATE UNIQUE INDEX uk_staff_name ON t_staff(staff_name); -- 创建唯一索引
  3. CREATE BITMAP INDEX idx_gender ON t_staff(gender); -- 创建位图索引
  4. CREATE INDEX idx_dept_code ON t_staff(UPPER(dept_code)); -- 创建基于函数的索引
  5. CREATE INDEX idx_birthday ON t_staff(birthday) REVERSE; -- 创建反向键索引

索引有单列索引和组合索引之分,上面 5 个索引都属于单列索引,如果要创建组合索引,即在多个列上创建索引,只要在上面创建索引的语句中括号里加入更多字段并用逗号隔开即可。

修改索引 & 删除索引

修改索引:创建索引时还可以指定表空间,修改时也能调整表空间等索引属性,下面只示例几个本人用过的语法:

  1. ALTER INDEX idx_manager_id UNUSABLE; -- 禁用索引
  2. ALTER INDEX idx_manager_id REBUILD REVERSE; -- 将普通索引修改为反向键索引
  3. ALTER INDEX idx_manager_id REBUILD NOREVERSE; -- 将反向键索引修改为普通索引
  4. ALTER INDEX idx_manager_id RENAME TO idx_test; -- 将索引名从 idx_staff_name 改成 idx_test

删除索引:如果发现索引建错了也可以直接删除掉,示例:

  1. DROP INDEX idx_test;

总结

本文主要介绍了关于表的常见 SQL 语法,不知道大家有没有发现如下两个规律:

规律一:当成功创建一个主键约束之后,Oracle 会自动基于相同的字段列表再创建一个同名的唯一索引,反之不会。

规律二:当成功创建一个唯一约束之后,Oracle 会自动基于相同的字段列表再创建一个同名的唯一索引,反之不会。

《.Net程序员学用Oracle系列:导航目录》

本文声明:如果您认为这篇文章还可以或对您有帮助,请点击文章末尾的“推荐”按钮。欢迎转载、演绎或用于商业目的,但必须保留本文的署名韩宗泽,并且要在明显位置给出原文链接!本人初写博客,水平有限,若有不当之处,敬请批评指正,谢谢!

.Net程序员学用Oracle系列(6):表、字段、注释、约束、索引的更多相关文章

  1. .Net程序员学用Oracle系列(1):导航目录

    本人从事基于 Oracle 的 .Net 企业级开发近三年,在此之前学习和使用的都是 (MS)SQL Server.未曾系统的了解过 Oracle,所以长时间感到各种不习惯.不方便.怪异和不解,常会遇 ...

  2. .Net程序员学用Oracle系列(2):准备测试环境

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.创建说明 1.1.为什么要创建的测试环境? 1.2.了解 Oracle 实例的默认用户 2.创建环境 2.1.创建基本环境 ...

  3. .Net程序员学用Oracle系列(7):视图、函数、过程、包

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.视图 1.1.创建视图 2.函数 2.1.创建函数 2.2.调用函数 3.过程 3.1.创建过程 3.2.调用过程 4.包 ...

  4. .Net程序员学用Oracle系列(8):触发器、任务、序列、连接

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.触发器 1.1.创建触发器 1.2.禁用触发器 & 启用触发器 & 删除触发器 2.任务 2.1.DBMS_ ...

  5. .Net程序员学用Oracle系列(9):系统函数(上)

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.字符函数 1.1.字符函数简介 1.2.语法说明及案例 2.数字函数 2.1.数字函数简介 2.2.语法说明及案例 3.日期 ...

  6. .Net程序员学用Oracle系列(10):系统函数(下)

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.转换函数 1.1.TO_CHAR 1.2.TO_NUMBER 1.3.TO_DATE 1.4.CAST 2.近似值函数 2. ...

  7. .Net程序员学用Oracle系列(11):系统函数(下)

    1.聚合函数 1.1.COUNT 函数 1.2.SUM 函数 1.3.MAX 函数 1.4.MIN 函数 1.5.AVG 函数 2.ROWNUM 函数 2.1.ROWNUM 函数简介 2.2.利用 R ...

  8. .Net程序员学用Oracle系列(15):DUAL、ROWID、NULL

    1.DUAL 表 2.ROWID 类型 2.1.利用 ROWID 查询数据 2.2.利用 ROWID 更新数据 3.NULL 值 3.1.NULL 与空字符串 3.2.NULL 与函数 3.3.NUL ...

  9. .Net程序员学用Oracle系列(25):触发器详解

    1.触发器理论 1.1.触发器的应用场景 1.2.触发器的类型 1.3.DML 触发器的触发顺序 2.触发器实战 2.1.创建触发器 2.1.1.创建 DML 触发器 2.1.2.创建 DDL 触发器 ...

随机推荐

  1. ichartjs 使用BUG,assign_scale:true 解决

    今天纯属灌水,好久没灌水的. 最近使用了flotr2 和 ichartjs进行canvas图标的开发,都不能满足需求. 没办法,先将就用用吧.然后,既然其他大神推荐使用ichartjs,为了统一,我也 ...

  2. vim打开出现的文档^M什么

    网上公开的一些代码,发现里面多^M符号.这是什么? 我搜索^M没有效果,这应该是一个特殊的控制字符.找换行的结果是不.在每一行的末尾是回车,代替它周围包裹,对于由线定义不同的编码系统是不一样的. li ...

  3. 【COCOS2DX-游戏开发之三四】cocos2dx 3.0 TableView特殊使用方法:滚动时不能选择等等

    cocos2dx 3.0版本号TableView拍生自ScrollView,经常使用来做滚动列表,有几种特殊使用方法,不知道大家用到过没 要求:1.滚动时不能选中TableCell,非滚动状态才干选中 ...

  4. 使用Clean() 去掉由函数自动生成的字符串中的双引号

    有时候由Excel单元格函数軿凑出来的字符串会自带双引号 效果如下: 想这种这个情况,刚好我们軿凑出来的是SQL语句, 执行的时候是去掉双引号, 这时候可以使用Excel自带的函数来去掉双引号 Cle ...

  5. Andorid类似Fragment更换布置方法

    public void replaceRightView(View v) { int f = LinearLayout.LayoutParams.MATCH_PARENT; LinearLayout. ...

  6. BackgroundWorker组件使用总结

    首先在窗体拖入一个BackgroundWorker组件,根据功能需要设置BackgroundWorker的属性 WorkerSupportsCancellation = true; 允许取消后台正在执 ...

  7. hibernate在持久对象的生命周期(三州:自由状态,持久状态,自由状态 之间的转换)

    三种状态的基本概念: 1.  临时身份(Transient):也被称为自由状态,它只存在于内存中,并且在数据库中没有相应的数据. 使用new创建的对象,久化,没有处于Session中,处于此状态的对象 ...

  8. iOS:由URL成员UIImage

    很多时候,我们只能得到URL.然后,需要建立一个UIImage. 在正常情况下,.我们一般通过SDWebImage直接施工UIImageVIew的image,如何使用URL直接施工UIImage它? ...

  9. Mysql高级之游标

    原文:Mysql高级之游标 什么是游标?select 语句也许一次性会取出来n条语句,那么游标便可以一次取出来select中的一条记录.每取出来一条,便向下移动一次!可以实现很复杂逻辑! 上面还有有一 ...

  10. Visual Studio 2013 的 Browser Link 功能

    Visual Studio 2013 的 Browser Link 功能 最近公司弄新项目需要用 MVC,就把 IDE 升级到了 Visual Studio 2013,在开发的时候发现有好多请求一个本 ...