当前位置:编程问答 > Unix/Linux >

创建和管理表及约束

一、数据的对象包括表、索引、序列、视图、同义词等结构。
 这节课我们主要介绍表的操作,索引、序列、视图、同义词这块内容我们下一节介绍。

  www.zzzyk.com  
二、表的创建
1、数据库中主要主要保存数据,而数据是以什么形式保存的呢?表由行、列两个重要元素构成。
 行结构行由头、长度、行值组成。


2、表名和列名命名的规则:
(1)必须只包含字母a - z、a - z,0 - 9,_,$,#
(2)而且必须字母开头
(3)不能超过30个字节,
(4)不能包含特珠字母,
(5)在同一个用户下表名不能和其它对象同名
(6)不要使用Oracle的保留字(select * from v$reserved_words order by keyword;)
  注:当加上双引号就可以使用保留字,但是不推存!!!!


3、创建表的步骤
(1)查数据库文件
sys@OCM> select * from v$dbfile;


 FILE# NAME
---------- --------------------------------------------------
  10 /u01/app/oracle/oradata/ocm/undotbs02.dbf
 5 /u01/app/oracle/oradata/ocm/example01.dbf


(2)创建表空间
sys@OCM> create tablespace tp3 datafile '/u01/app/oracle/oradata/ocm/tp3.dbf' size 200M;


Tablespace created.


(3)创建用户
sys@OCM> create user gyj identified by gyj default tablespace tp3;


User created.


 (4)给用户授权
sys@OCM> gyj@OCM> grant dba to gyj;


Grant succeeded.


 (5)创建表
gyj@OCM> CREATE TABLE dept
  2  (deptno  NUMBER(2),
  3   dname   VARCHAR2(14),
  4   loc   VARCHAR2(13),
  5   create_date DATE DEFAULT SYSDATE);


Table created.


gyj@OCM> select * from gyj.dept;


no rows selected


这个命令中,CREATE TABLE是创建表的命令,dept表名,deptno 、dname 、age 、loc 、create_date是列的名字。
NUMBER和VARCHAR2,SYSDATE是列的类型。
NUMBER (2)表示,此列只能包括2位数以内的整数。如果需要小数,可以这样:NUMBER (10 ,2) ,10是总长度,2是小数位数,整个数据的长度是整数8位、小数2位。
VARCHAR2是字符型,括号中的数字是字符串的长度。
SYSDATE是系统时间,DEFAULT表示给列create_date设一个默认值:当时插入记录时的系统时间。
  www.zzzyk.com  

4、表的类型
(1)根据表中数据的用途,我们可以将表分为两大类:用户表和数据字典表
(2)表存储、组织数据方式的不同,我们可以将表分为:堆表、索引组织表、聚簇表
 
5、数据类型
 
 
(1)字符型:VARCHAR2 | CAHR | NVARCHAR2 | NCAHR 
(2)数字型:NUMBER,是可变的,最多可以存储 38 个有效数位
(3)日期型:DATE 固定为7个字节,TIMESTAMP 这是一个7字节或11字节,可以带小数秒,最多保留9位
(4)RAW 数据类型:最多2000个字节,不做任何字符集转换
(5)LONG、LONG RAW(2G) 和大型对象LOB 数据类型 (4G)
(6)ROWID与UROWID:ROWID是18位,实际只存12位(不存储对象号6位),UROWID主要在索引组织表中使用


三、约束的创建
约束是针对列的。在用户添加或修改列数据时,它用来对列数据用出一些限制。例如,非空约束限制了列不能为空。这就是约束。
 
1、非空约束 NOT NULL 
 我们可以在创建表的同时,创建约束。也可以先创建表,以后在有需要时,添回约束。下面我们先说在创建表的同时,创建约束。
(1)建立表时指定约束
 先看一个例子:
gyj@OCM> drop table t2;


Table dropped.


gyj@OCM> create table t2(id number(10) constraint c_id not null, name varchar2(20));


Table created.


上面的命令创建T2表,并在ID列上创建名为C_ID的非空约束。其中,CONSTRAINT c_id的C_ID就是约束的名字。如果我们在创建约束时,也可以不为约束起名字,这样就可以省略CONSTRAINTc_id,那么系统将自动为约束命名:
gyj@OCM> drop table t2;


Table dropped.


gyj@OCM> create table t2(id number(10) not null,name varchar2(20));


Table created.


只需要在列名后添加NOT NULL就可以了。这样很简单,但是ORACLE将自动为此约束起一个非常复杂的名字。
这是在创建表的同时创建约束。有些表是在创建之后,才发现应该为表中的某些列添加约束。


下面我们说一下如何在创建表之后,添加约束。
(2)在创建表后添加非空约束
语法形式为:alter table 表名 modify (列名 类型(长度)[DEFAULT 默认值] [非空约束]) ;
这条命令的大部分,我们在前一章已经讲过,它可以更改表中指定列的长度、类型和默认值。当然,它还可以为表添加非空约束。注意,这条命令只能为表添加非空约束。其他类型的约束不使用此命令。
gyj@OCM> drop table t2;


Table dropped.


gyj@OCM> create table t2(id number(10), name varchar2(20));


Table created.


gyj@OCM> alter table t2 modify (id constraint c_id not null);


Table altered.


同样,约束名可以省略,如果省略,系统将自定约束名。


(3)删除约束
删除约束非常简单,我们看下面的测试吧,删除上面刚建立的t2_ID_NN约束。
gyj@OCM>  alter table t2 drop constraint c_id;


Table altered.


2、条件检查约束 CHECK  
CHECK非常简单,我们看下面的例子。我想将T2表的ID列值的大小,限制为正整数,也就是说能是0或负数:
gyj@OCM> drop table t2;


Table dropped.


gyj@OCM> create table t2(id number(10) constraint c_id_1 check (id>=1),name varchar2(20));


Table created.


向ID列插入一个0试试:
gyj@OCM> insert into t2(id) values(0);
insert into t2(id) values(0)
*
ERROR at line 1:
ORA-02290: check constraint (GYJ.C_ID_1) violated


像上面这样把约束的创建,直接放在列的后,这种方式创建的约束,被称为列级约束,也简称列约束。除了列级约束,还有表级约束,简称表约束。从隶属关系上来讲,列约束的相关信息,和列存储在一起,因此说列约束是属于列的。而表约束的相关信息,则和表存贮在一起,表约束属于表。从功能上讲,列约束和表约束是一样的。创建方式也非常的相似,下面我们建立一个属于表的CHECK约束:
gyj@OCM> drop table t2;


Table dropped.


gyj@OCM> create table t2(id number(10), name varchar2(20),constraint t2_id_1 check (id>=1) );


Table created.
也就是约束并不跟在列之后定义,而是在在所有列之后,另行定义。这样创建的约束,就是在表级创建约束,也就表约束。但是我们要明白,其实表约束仍是约束表中的列的,它仍是对列发挥作用,只不过像上面t2_id_1约束的信息,被存贮在表层,和表放在一起。
约束中,非空约束必须是列约束。其他类型的约束都即可以是列约束,也可以创建为表约束。不过和列约束相比,表约束有一个列约束所不能提供的功能,就是,一个表约束中可以涉及多列:
gyj@OCM> drop table t2;


Table dropped.


gyj@OCM> create table t2(id number(10), 
  2   age number(3), 
  3   name varchar2(20), 
  4   company varchar2(40),
  5   constraint t2_id_1 check (id>=age ) );


Table created.
此约束的意义是规定ID列必须大于等于AGE列的值。像这样涉及两个列的约束,必须在表级创建。在列级创建的约束,只能针对某一个列。
如果是在创建表后再添加约束,命令如下:
gyj@OCM> drop table t2;


Table dropped.


gyj@OCM> create table t2(id number(10), age number(3), name varchar2(20), company varchar2(40));


Table created.


gyj@OCM> alter table t2 add(constraint t2_id_age_c check (id>age));


Table altered.


和添加非空约束相比,仍然是使用ALTER TABLE命令,但不在是MODIFY,而是ADD。这条命令也可以用来为表新增列除了非空约束外,其他类型的约束必须使用此命令添加。这样添加的约束,都是
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,