WEB开发网
开发学院数据库Oracle Oracle 10g数据库基础之基本DDL和DML语句 阅读

Oracle 10g数据库基础之基本DDL和DML语句

 2012-05-20 08:04:26 来源:WEB开发网   
核心提示:使用default值进行表的修改SQL> create table t1(c1 number(2) default 10,c2 char(10) default 'bj');Table createdSQL> insert into t1(c1)values(20);1 row insert
使用default值进行表的修改

SQL> create table t1(c1 number(2) default 10,c2 char(10) default 'bj');

Table created
SQL> insert into t1(c1)values(20);
1 row inserted
SQL> select * from t1;
 C1 C2
--- ----------
 20 bj
SQL> update t1 set c1=default;
1 row updated
SQL> select * from t1;
 C1 C2
--- ----------
 10 bj
SQL>

如果没有指定default的值,那么为null值。

Delete删除行
Delete t1;--所有的行都删除。
Delete emp2 where sal>2000;

将符合条件的行删除

事务的概念和事务的控制

该实验的目的是了解事务的概念,提交回退和控制事务.

Transaction事务的概念

开始:第一个dml语句

结束:commit或者rollback

未完成的事务可以撤消

未完成的事务,其它会话看不到结果,只能看到已经提交的结果。

维护事务需要锁和回退段的参与

提交事务commit

1. 手工直接提交commit

2.自动提交

ddl,dcl语句

exit退出sqlplus

3.提交后

事务结束

释放锁和回退

其它用户可以看到结果,修改过的结果

撤消事务rollback

1. 手工直接撤消rollback

2.自动撤消

网络或数据库崩溃

强制退出sqlplus

3.撤消后

事务结束

修改前的数据恢复了

释放锁和回退

其它用户可以看到结果,未修改的结果

实验3:在表上建立不同类型的约束

约束就是指对插入数据的各种限制,例如:人员的姓名不能为空,人的年龄只能在0~150岁之间。约束可以对数据库中的数据进行保护。约束可以在建表的时候直接声明,也可以为已建好的表添加约束。

约束(constraint)

保证数据的有效

保证数据的安全

可以自己书写代码

使用触发器

使用oracle提供的五类约束

该实验的目的是掌握oracle提供的五种约束.

Not null

定义在表的列上,表明该列必须要有值,不能为null

可以在建立表的时候说明

也可以在表建立后修改为not null

可以给约束指定名称。

如果不指定名称,数据库会给一个系统自动指定名称,SYS_C#######

User_constraints,user_cons_columns可以查看到约束的信息

建立表的时候指定not null约束

SQL> CREATE TABLE person
  2  (
  3  pid NUMBER ,
  4  name VARCHAR(30) NOT NULL
  5  ) ;
Table created
SQL> -- 插入数据
SQL> INSERT INTO person(pid,name) VALUES (11,'张三');
1 row inserted
SQL> INSERT INTO person(pid) VALUES (12);
INSERT INTO person(pid) VALUES (12)

ORA-01400: cannot insert NULL into ("SCOTT"."PERSON"."NAME")

SQL> -- 错误的数据,会受到约束限制,无法插入
SQL> create table t1 (name char(9) not null,

  2  telenum char(8) constraint t1_tele_nl not null);

Table created
SQL> desc t1;
Name   Type   Nullable Default Comments
------- ------- -------- ------- --------
NAME   CHAR(9)             

TELENUM CHAR(8)               

建立表的时候指明非空约束,一个是系统命名,一个是我们命名。

SQL> select CONSTRAINT_NAME,CONSTRAINT_type,TABLE_NAME,
column_name from user_constraints natural join user_cons_columns;

我们通过数据字典来验证我们的实验结果。

建立表后指定not null约束。要使用modify语法。你不指定名称,数据库自己命名。

SQL> drop table t1;
Table dropped
SQL> create table t1 as select * from dept;
Table created
SQL> alter table t1 modify(dname not null);
Table altered
SQL> desc t1;
Name  Type     Nullable Default Comments
------ ------------ -------- ------- --------
DEPTNO NUMBER(2)   Y              
DNAME  VARCHAR2(14)             
LOC   VARCHAR2(13) Y
唯一约束UNIQUE

列的值不能重复

可以为NULL

是用索引来维护唯一的

索引的名称和约束的名称相同

建立表的时候指定UNIQUE约束

SQL> DROP TABLE person ;
Table dropped
SQL> CREATE TABLE person
  2  (
  3  pid NUMBER PRIMARY KEY NOT NULL ,
  4  name VARCHAR(30) NOT NULL ,
  5  tel VARCHAR(50) UNIQUE
  6  ) ;
Table created
SQL>
SQL> -- 插入数据
SQL> INSERT INTO person(pid,name,tel) VALUES (11,'张三','1234567');
1 row inserted
SQL> -- 电话重复了
SQL> INSERT INTO person(pid,name,tel) VALUES (12,'李四','1234567');
INSERT INTO person(pid,name,tel) VALUES (12,'李四','1234567')
ORA-00001: unique constraint (SCOTT.SYS_C005400) violated
SQL>

建立表之后指定UNIQUE约束

SQL> create table t1 as select * from dept;
Table created
SQL> alter table t1 add constraint u_dname unique (dname);
Table altered

Check检测约束

条件约束,插入的数据必须满足某些条件

例如:人员有年龄,年龄的取值只能是0~150岁之间

SQL> DROP TABLE person ;
Table dropped
SQL> CREATE TABLE person
  2  (
  3  pid NUMBER PRIMARY KEY NOT NULL ,
  4 
  4  name VARCHAR(30) NOT NULL ,
  5  tel VARCHAR(50) NOT NULL UNIQUE ,
  6  age NUMBER CHECK(age BETWEEN 0 AND 150)
  7  ) ;
Table created
SQL> -- 插入数据
SQL> INSERT INTO person(pid,name,tel,age) VALUES (11,'张三','1234567',30);
1 row inserted
SQL> -- 年龄的输入错误
SQL> INSERT INTO person(pid,name,tel,age) VALUES (12,'李四','2345678',-100);
INSERT INTO person(pid,name,tel,age) VALUES (12,'李四','2345678',-100)

ORA-02290: check constraint (SCOTT.SYS_C005405) violated

SQL>
Primary key 主健约束

一个表只能有一个主健

主健要求唯一并且非空

可以是联合主健,联合主健每列都要求非空

主健能唯一定位一行,所以主键也叫逻辑rowid

主健不是必需的,可以没有

主健是通过索引实现的

索引的名称和主健名称相同

SQL> DROP TABLE person ;
Table dropped
SQL> CREATE TABLE person
  2  (
  3  pid NUMBER PRIMARY KEY ,
  4  name VARCHAR(30) NOT NULL
  5  ) ;
Table created
SQL> -- 插入数据
SQL> INSERT INTO person(pid,name) VALUES (11,'张三');
1 row inserted
SQL> -- 主键重复了
SQL> INSERT INTO person(pid,name) VALUES (11,'李四');

INSERT INTO person(pid,name) VALUES (11,'李四')

ORA-00001: unique constraint (SCOTT.SYS_C005409) violated
SQL>

SQL> --表建立后指定自命名的主健

SQL> drop table t1;
Table dropped
SQL>
SQL> create table t1(mail char(8) ,name char(8));
Table created
SQL> alter table t1 add constraint pk_t1_mail primary key (mail) ;
Table altered
SQL> -- 插入数据
SQL> INSERT INTO t1 VALUES (11,'张三');
1 row inserted
SQL> -- 主键重复了
SQL> INSERT INTO t1 VALUES (11,'里德');
INSERT INTO t1 VALUES (11,'里德')
ORA-00001: unique constraint (SCOTT.PK_T1_MAIL) violated
foreign key外健

指定在表的列上

引用本表其它列,或其它表的其它列

被引用的列得有唯一约束或者主健约束,因为引用的是索引的键值,而不是真正的表。

目的是维护数据的完整性

核心是一列是另外一列的子集,null除外

建立主健,建立一个外健来引用主健

SQL> --建立主健,建立一个外健来引用主健

SQL>
SQL> create table d as select * from dept;
Table created
SQL> create table e as select * from emp;
Table created
SQL>
SQL> alter table d add constraint pk_d primary key (deptNO) ;
Table altered

SQL> alter table e add constraint fk_e foreign key (deptno) references d(deptno) ;

Table altered

SQL> --违反约束

SQL> delete d where deptno=10;
delete d where deptno=10

ORA-02292: integrity constraint (SCOTT.FK_E) violated - child record found

ORA-02292: 违反完整约束条件 (SCOTT.FK_E) - 已找到子记录
SQL> update e set deptno=50;
update e set deptno=50

ORA-02291: integrity constraint (SCOTT.FK_E) violated - parent key not found

ORA-02291: 违反完整约束条件 (SCOTT.FK_E) - 未找到父项关键字
SQL>

SQL> --建立被级连的外健

SQL>
SQL> alter table e drop constraint FK_E;
Table altered
SQL> alter table e add constraint fk_e foreign key (deptno)
  2  references d(deptno) on delete set null;
Table altered

SQL> --父表的值被删除,子表的相关列自动被赋予NULL值。

SQL>
SQL> alter table e drop constraint FK_E;
Table altered
SQL> alter table e add constraint fk_e foreign key (deptno)
  2  references d(deptno) on delete cascade;
Table altered

SQL> --父表的值被删除,子表的相关行自动被删除。

SQL>
删除约束

任何约束都可以用约束名称来删除

Alter table ### drop constraint ****;

因为主健只能有一个,所以删除主健约束的时候也可以

Alter table ### drop primary key;

如果主健和唯一性约束被删除,自动建立的索引也会同时被清除。

Not Null约束也可以用alter table modify来删除。

删除有外健引用的主健或唯一约束的时候,外健也要被级连删除。

Alter table ### drop primary key cascade;

如果不加cascade,你删不了,报有外键在使用,不能删除。

按约束的名称来删除约束(可以删除各种约束)

Alter table t1 drop constraint sys_c03033;

非空约束的第二种删除方式

alter table t1 modify (name not null);
alter table t1 modify (name null);
启用约束
ALTER TABLE book enable CONSTRAINT person_book_pid_fk ;
禁用约束
ALTER TABLE book disable CONSTRAINT person_book_pid_fk ;

上一页  1 2 3 4 

Tags:Oracle 数据库 基础

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接