创建和管理表及约束
一、数据的对象包括表、索引、序列、视图、同义词等结构。
这节课我们主要介绍表的操作,索引、序列、视图、同义词这块内容我们下一节介绍。
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)表存储、组织数据方式的不同,我们可以将表分为:堆表、索引组织表、聚簇表
这节课我们主要介绍表的操作,索引、序列、视图、同义词这块内容我们下一节介绍。
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主要在索引组织表中使用
三、约束的创建
(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。这条命令也可以用来为表新增列除了非空约束外,其他类型的约束必须使用此命令添加。这样添加的约束,都是
我们可以在创建表的同时,创建约束。也可以先创建表,以后在有需要时,添回约束。下面我们先说在创建表的同时,创建约束。
(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。这条命令也可以用来为表新增列除了非空约束外,其他类型的约束必须使用此命令添加。这样添加的约束,都是