经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
oracle 表的创建与管理 约束
来源:cnblogs  作者:xianting  时间:2019/3/26 9:34:55  对本文有异议

在 Oracle 之中数据表就被称为
数据库对象,而对象的操作语法一共有三种:
· 创建对象:CREATE 对象类型 对象名称 [选项];
· 删除对象:DROP 对象类型 对象名称 [选项];
· 修改对象:ALTER 对象类型 对象名称 [选项]。

创建表

 

  1. CREATE TABLE 表名称 (
  2. 字段 类型 [DEFAULT 默认值] ,
  3. 字段 类型 [DEFAULT 默认值] ,
  4. ...
  5. 字段 类型 [DEFAULT 默认值]
  6. )

 

一般而言,默认值是为了防止用户在增加数据时为 null 的问题。

复制表

实际上所谓的复制表严格来讲不是复制的含义,是针对于一个子查询(返回多行多列)的结果进行表的创建,完整
语法如下:
CREATE TABLE 表名称 AS 子查询

注意点:关于事务与 DDL 的问题
· 事务可以控制的只是数据的更新操作(增加、修改、删除),而 DDL 是不受事务控制的;
· 在 Oracle 之中,如果发生了 DDL 操作,那么所有未提交的事务将会自动进行提交。

在 Oracle 之中有三类数据字典:
· user_*:用户可以使用的数据字典;
· dba_*:管理员可以使用到的数据字典;
· all_*:包含了当前用户可以访问的全部数据字典信息(有可能某些数据字典不属于此用户)。

 

为表重命名

RENAME 旧的表名称 TO 新的表名称 ;

 

截断表

TRUNCATE TABLE 表名称 ;

表一旦被截断,其所有占用的资源都将被彻底释放。

删除数据表

DROP TABLE 表名称 ;

闪回操作

 

从 Oracle 10g 起为了方便用户进行数据表的恢复。为 Oracle 增加了一个类似于 windows 的回收站功能,等于是所有
删除是数据表,首先保存在回收站之中,如果用户有需要也可以进行恢复。

  1. 范例:通过回收站恢复 emp10 数据表
  2. FLASHBACK TABLE emp10 TO BEFORE DROP ;
  3. 范例:彻底删除数据表,不让删除的数据表经过回收站,在删除语句之后增加一个 PURGE
  4. DROP TABLE emp10 PURGE ;
  5. 范例:删除回收站之中的一个表
  6. PURGE TABLE empnull ;
  7. 范例:清空回收站
  8. PURGE RECYCLEBIN ;
  9. 只有 oracle 有此特性

修改表结构

  1. 1 为表中增加数据列
  2. ALTER TABLE 表名称 ADD(
  3. 列名称 数据类型 [DEFAULT 默认值],
  4. 列名称 数据类型 [DEFAULT 默认值], ...)
  5. 2 修改列结构
  6. ALTER TABLE 表名称 MODIFY(
  7. 列名称 数据类型 [DEFAULT 默认值],
  8. 列名称 数据类型 [DEFAULT 默认值], ...) ;

从标准的 SQL 来讲,是一定要提供有数据表的修改操作的,但是从实际的开发来讲,任何人都不允许有随意修改数
据表结构的想法,而且更不能说自己去修改。

 

约束是保证表中数据完整性的一种有效检测手

非空约束(NOT NULL,NK)

  1. DROP TABLE member ;
  2. CREATE TABLE member(
  3. mid NUMBER ,
  4. name VARCHAR2(20) NOT NULL
  5. ) ;
  6. INSERT INTO member(mid,name) VALUES(1,null)

此时,数据库会提示如下错误信息:“ORA-01400: 无法将 NULL 插入 ("SCOTT"."MEMBER"."NAME")”。此时会
明确的显示出那个字段上违反了非空约束。

唯一约束(UNIQUE,UK)

  1. DROP TABLE member ;
  2. CREATE TABLE member(
  3. mid NUMBER ,
  4. name VARCHAR2(20) NOT NULL ,
  5. email VARCHAR2(20) UNIQUE
  6. ) ;
  7. 范例:增加正确的数据
  8. INSERT INTO member(mid,name) VALUES (1,'王小强') ;
  9. INSERT INTO member(mid,name,email) VALUES (1,'王大强','110@china.com') ;
  10. 在使用唯一约束的时候一定要记住,null 不属于重复的统计范畴。
  11. 范例:增加错误的数据
  12. INSERT INTO member(mid,name,email) VALUES (1,'王中强','110@china.com') ;
  13. 此时出现了错误的提示信息:“ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0011101)”。但是与之前的非空约束相
  14. 比,此时的提示信息非常不明确。
  1. DROP TABLE member PURGE ;
  2. CREATE TABLE member(
  3. mid NUMBER ,
  4. name VARCHAR2(20)NOT NULL ,
  5. email VARCHAR2(20) ,
  6. CONSTRAINT uk_email UNIQUE(email)
  7. ) ;

此时,如果保存的数据出现了错误,则提示信息“ORA-00001: 违反唯一约束条件 (SCOTT.UK_EMAIL)”。
除了非空约束之外,所有的约束都一定要按照以上的方式进行设置,因为只有一个正常的名称才方便系统进行约束
的维护

主键约束(PRIMARY KEY,PK)

主键约束 = 非空约束 + 唯一约束。

  1. DROP TABLE member PURGE ;
  2. CREATE TABLE member(
  3. mid NUMBER ,
  4. name VARCHAR2(20)NOT NULL ,
  5. CONSTRAINT pk_mid PRIMARY KEY(mid)
  6. ) ;
  1. 观察复合主键
  2. DROP TABLE member PURGE ;
  3. CREATE TABLE member(
  4. mid NUMBER ,
  5. name VARCHAR2(20) ,
  6. CONSTRAINT pk_mid_name PRIMARY KEY(mid,name)
  7. ) ;
  8. INSERT INTO member(mid,name) VALUES(1,'学冰') ;
  9. INSERT INTO member(mid,name) VALUES(1,'学刁') ;
  10. INSERT INTO member(mid,name) VALUES(2,'学刁') ;
  11. 正常人都不用,知道就行了,千万别用。

检查约束(CHECK,CK)

  1. DROP TABLE member PURGE ;
  2. CREATE TABLE member(
  3. mid NUMBER ,
  4. name VARCHAR2(20)NOT NULL ,
  5. sex VARCHAR2(10) ,
  6. age NUMBER(3) ,
  7. CONSTRAINT pk_mid PRIMARY KEY(mid) ,
  8. CONSTRAINT ck_sex CHECK (sex IN ('','')) ,
  9. CONSTRAINT ck_age CHECK (age BETWEEN 0 AND 250)
  10. ) ;

即使设置了多个检查约束,那么也是一个一个约束进行过滤的。
但是在这里有一个提示:一般而言,你所设置的约束越多,在进行数据更新操作的时候性能就越低。所以很多时候
一些数据的检查操作都会交给程序完成

 主-外键约束(FOREIGN KEY,FK)

  1. DROP TABLE member PURGE ;
  2. DROP TABLE book PURGE ;
  3. CREATE TABLE member(
  4. mid NUMBER ,
  5. name VARCHAR2(20)NOT NULL ,
  6. CONSTRAINT pk_mid PRIMARY KEY(mid)
  7. ) ;
  8. CREATE TABLE book(
  9. bid NUMBER ,
  10. title VARCHAR2(20) ,
  11. mid NUMBER ,
  12. CONSTRAINT pk_bid PRIMARY KEY(bid) ,
  13. CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid)
  14. ) ;

限制一:在删除主表之前,请一定要保证先删除子表。所以在删除数据表的时候应该先删除子表后再删除父表。

  1. 范例:强制删除
  2. DROP TABLE member CASCADE CONSTRAINT ;
  3. 但是必须注意的是,强制删除是无法彻底删除的,所删除的数据表会保存在回收站之中。但是不建议使用强制删除
  4. 表的操作,还是建议按照先删除子表再删除父表的方式进行。

限制二:作为外键的字段在主表之中必须具备主键约束或者是唯一约束。

限制三:数据的级联操作问题

· 为了方便数据的删除,提供有一个级联删除操作,在主表数据删除的时候对应的子表数据会同时删除掉,在建立
外键的时候使用 ON DELETE CASCADE 来设置。

  1. 范例:设置级联删除
  2. DROP TABLE book PURGE ;
  3. DROP TABLE member PURGE ;
  4. CREATE TABLE member(
  5. mid NUMBER ,
  6. name VARCHAR2(20)NOT NULL ,
  7. CONSTRAINT pk_mid PRIMARY KEY(mid)
  8. ) ;
  9. CREATE TABLE book(
  10. bid NUMBER ,
  11. title VARCHAR2(20) ,
  12. mid NUMBER ,
  13. CONSTRAINT pk_bid PRIMARY KEY(bid) ,
  14. CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ON DELETE CASCADE
  15. ) ;

· 如果在删除主表数据的时候不希望子表数据被一起删除掉,则可以使用级联更新操作,使用 ON DELETE SET
NULL 来设置。

  1. 范例:设置级联更新
  2. DROP TABLE book PURGE ;
  3. DROP TABLE member PURGE ;
  4. CREATE TABLE member(
  5. mid NUMBER ,
  6. name VARCHAR2(20)NOT NULL ,
  7. CONSTRAINT pk_mid PRIMARY KEY(mid)
  8. ) ;
  9. CREATE TABLE book(
  10. bid NUMBER ,
  11. title VARCHAR2(20) ,
  12. mid NUMBER ,
  13. CONSTRAINT pk_bid PRIMARY KEY(bid) ,
  14. CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ON DELETE SET NULL
  15. ) ;

修改约束

首先明确:所有的约束一定要在表建立的同时就已经设置完成,不可能说表先去使用之后再回头设置约束,所以以
下的这些

  1. 1 为表中增加约束
  2. ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(约束字段) [选项] ;
  3. 但是需要提醒的是,此类的语法适合于唯一、主键、检查、外键约束的添加,而无法添加非空约束
  4. 2 删除约束
  5. ALTER TABLE 表名称 DROP CONSTRAINT 约束名称 ;

 

意义

原文链接:http://www.cnblogs.com/xianting/p/10595807.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号