使用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 ;