06-Oracle增删改表与约束

字符串:使用VARCHAR2描述

数字:在Oracle之中使用NUMBER来描述数字,如果描述小数使用“NUMBER(m,n)

       |- 整数,使用INT

       |- 小数,使用FLOAT

日期:使用DATE是最为常见的做法,但是在Oracle里面DATE里面包含有日期时间,可是其他的数据库里面DATE可能只是日期,DATETIME才表示日期时间

· 大文本数据:使用CLOB描述,最多可以保存4G的文字信息;

              · 大对象数据:使用BLOB,保存图片、音乐、电影、文字,最多可以保存4G

       从实际的开发来讲使用VARCHAR2NUMBERDATECLOB

 

如果要进行数据表的创建,则可以使用如下的语法完成:

CREATE TABLE表名称(

         列名称               类型           [DEFAULT 默认值] ,

         列名称               类型           [DEFAULT 默认值] ,

         列名称               类型           [DEFAULT 默认值] ,

                   ..

         列名称               类型           [DEFAULT 默认值]

) ;

create:创建

删除数据表; drop table 表名称

彻底删除,drop table purge;

清空回收站:purge recyclebin

 

常用数据类型(重点

1创建一张成员表

create table member(

  mid    number,

  name  varchar2(20) default '无名氏',

  biredate date   default sysdate,

  node clob

);

创建完成之后就可以向表中保存数据

insert into member(mid,name,biredate,node)

values(1,'李四',to_date('2001-01-01','yyyy-mm-dd'),'我很善良');

 

2修改表结构

-- 删除数据表

DROP TABLE member PURGE ;

-- 清空回收站

PURGE RECYCLEBIN ;

-- 创建数据表

CREATE TABLE member(

       mid NUMBER ,

       name    VARCHAR2(20)

) ;

-- 测试数据

INSERT INTO member(mid,name) VALUES (1,'张三') ;

INSERT INTO member(mid,name) VALUES (2,'李四') ;

-- 提交事务

COMMIT ;

修改member表结构

alter table member modify(name varchar2(30) default'无名氏');

为表增加一个address

alter table member add(address varchar2(39));

增加一个sex列,这个列上设置默认值

alter table member add(address varchar2(20) default'男的');

删除表中的列

alter table member drop column sex

 

1  常用的四种数据类型:VARCHAR2NUMBERDATECLOB

2  DDL对象的操作语法:

       · 创建对象:CREATE 对象类型 对象名称 () ...

       · 删除对象:DROP 对象类型 对象名称 ...

       · 修改对象:ALTER 对象类型 对象名称 ....;

 

3非空约束NOT NULLNK

--删除数据表

drop table member purge;

--创建数据表

create table member(

    mid   number,

    name  varchar2(20)   not null

);

正确的增加语句

insert into member(mid,name) values(3,'张三');

错误的增加

insert into member(mid,name) values(3,null);

 

4唯一约束UNIQUEUK

--删除数据库

drop table member purge;

--创建数据表

create table member(

    mid   number,

    name  varchar2(20)  not null,

    email   varchar2(20) unique

);

保存正确的数据

insert into member(mid,name,email)values(2,'掌声',' [email protected] ');

用户的约束数据字典:user_constraints

COL owner FOR A30 ;

COL constraint_name FOR A30 ;

COL table_name FOR A30 ;

SELECT owner,constraint_name,table_name FROM user_constraints ;

可以发现“user_constraints”数据字典只是告诉用户约束属于那张表,但是并没有告诉用户约束具体是那个列上的,所以此时可以利用另外一个数据字典:user_cons_columns

范例:查询“user_cons_columns”数据字典

COL owner FOR A30 ;

COL constraint_name FOR A20 ;

COL table_name FOR A20 ;

COL column_name FOR A30 ;

SELECT owner,constraint_name,table_name,column_name FROM user_cons_columns ;

 

发现唯一约束并不像非空约束那样,可以很明确的告诉用户是那个列上出现问题,所以为了解决这样的错误,可以采用“约束简写_字段”,例如:唯一约束的简写是“UK”,那么现在是在email字段上设置了唯一约束,所以可以使用“uk_email”来作为此约束的名字,如果要指定名字,则必须在约束创建的时候完成,利用:CONSTRAINT关键字定义。

范例:创建唯一约束,同时设置约束名称

--删除数据表

drop table member purge;

--创建数据表

create table member(

    mid        number,

    name       varchar2(20)not null,

    email       varchar2(20),

    constraint  uk_我是邮箱 unique(email)

);

 

5主键约束(PRIMARY KEYPK

主键约束 = 非空约束 + 唯一约束。也就是说设置为主键列,不能够为空,不能够重复。像一般用户编号是不可能重复的,也不可能为空的。

--删除数据表

drop table member purge;

--创建数据表

create table member(

    mid       number,

    name      varchar2(20) not null,

    constraint pk_主键约束 primary key(mid)

);

 

6检查约束(CHECKCK

检查约束指的是在数据列上设置一些过滤条件,当过滤条件满足的时候才可以进行保存,如果不满足则出现错误,例如:如果设置年龄的信息,年龄0 ~ 250、性别:男、女。

--删除数据表

drop table member purge;

--创建数据表

create table member(

     mid     number,

     name    varchar2(20),

     age     number(3),

     constraint pk_mid primary key(mid),

     constraint 年龄0200 check(age between 0 and 200)

);

保存正确的数据

insert into member(mid,name,age)values(1,'张三','39');

保存错误的数据

insert into member(mid,name,age)values(2,'李四',201);

 

7外键约束(FOREIGN KEYFK

外键约束主要是在父子表关系中体现的一种约束操作。下面通过一个具体的操作来观察一下为什么会有外键约束的存在。例如,现在希望描述一种概念:一个人有多本书,如果要设计表现在需要设计两张数据表。则初期的设计如下:

范例:初期设计 ——不使用外键

--删除数据表

drop table member purge;

drop table book purge;

--创建数据表

create table member(

    mid    number,

    name   varchar2(20),

    constraint 主键约束mid primary key(mid)

);

--创建book数据表

create table book(

    bid    number,

    title    varchar2(20),

    mid    number

);

insert into member(mid,name)values(1,'张三');

insert into member(mid,name)values(2,'里斯');

insert into book(bid,title,mid)values(01,'Java',1);

insert into book(bid,title,mid)values(02,'Oracle',1);

insert into book(bid,title,mid)values(03,'Android',2);

insert into book(bid,title,mid)values(04,'Mysql',2);

但是此时,也有可能会增加如下的信息。

insert into book(bid,title,mid)values(20,'大家好',9);

此时member表中并没有编号为9的成员信息。但是由于此时没有设置所谓的约束,所以即使现在父表(member)中不存在对应的编号,那么子表也可以使用,但是这就是一个错误。

       实际上也就发现了,book表中的mid列的内容的取值应该是由member表中的mid列所决定,所以来将现在就可以利用外键约束来解决此类问题。在设置外键约束的时候必须要设置指定的外键列(book.mid列)需要与那张表的那个列有关联。

 

 

--删除数据库

drop table member purge;

drop table book purge;

--创建数据表

create table member(

      mid    number,

      name   varchar2(20),

      constraint pk_mid primary key(mid)

);

--创建数据表

create table book(

      bid   number,

      title   varchar2(20),

      mid   number,

      constraint fk_mid foreign key(mid) references member(mid)

);

insert into member(mid,name)values(1,'张三');

insert into member(mid,name)values(2,'里斯');

insert into book(bid,title,mid)values(01,'Java',1);

insert into book(bid,title,mid)values(02,'Oracle',1);

insert into book(bid,title,mid)values(03,'Android',2);

insert into book(bid,title,mid)values(04,'Mysql',2);

增加错误的数据,member.mid没有为9的数据

insert into book(bid,title,mid)values(20,'噢噢噢',9);

--此时book.mid的列的内容取值范围由member.mid列所决定。如果内容正确,则可以保存

insert into book(bid,title,mid)values(20,'哦哦哦',2);

 

如果要删除表,必须先删除子表后才能在删除主表

member是父表,book是子表,如果说现在book表没有删除,那么member表无法删除

--删除数据表

drop table book purge;

drop table member purge;

 

但是有些时候,一些奇葩的设计者,将A表作为B表的父表,B表也同时设置为了A表的父表,于是删不掉了。为此在Oracle里面专门提供了一个强制删除父表的操作,子表不会被删除,删除之后不关心子表。

drop table member cascade constraint;

也可以↓:

drop table book cascade constraint;

 

此时mid1的数据在book表中有对应的关联

使用DELETE删除member表的数据

delete from member where mid=1;

会出现:违反完整约束条件 (SCOTT.FK_MID) - 已找到子记录

但是如果说现在不想受到子记录的困扰,那么就可以使用级联的操作关系。级联的关系有两种:级联删除、级联更新

 

级联删除:

         所谓的级联删除指的是在父表数据已经被删除的情况下,自动删除其对应子表的数据。在定义外键的时候使用ON DELETE CASCADE即可。

范例:级联删除

--删除数据表

drop table book purge;

drop table member purge;

--创建数据表

create table member(

       mid     number,

       name    varchar2(20),

       constraint pk_mid primary key(mid)

);

create table book(

       bid    number,

       title    varchar2(20),

       mid     number,

       constraint fk_mid foreign key(mid) references member(mid) on delete cascade

);

insert into member(mid,name) values(1,'掌声');

insert into member(mid,name) values(2,'里斯');

insert into book(bid,title,mid) values(10,'Java',1);

insert into book(bid,title,mid) values(11,'Oracle',1);

insert into book(bid,title,mid) values(12,'Android',2);

insert into book(bid,title,mid) values(13,'Mysql',2);

此时当删除了父表数据之后,子表数据会同时删除掉。

delete from member where mid=2;

 

8修改约束

--删除数据表

drop table member purge;

--创建数据表

create table member(

    mid     number,

    name    varchar2(20)

);

insert into member(mid,name)values(1,'张三');

insert into member(mid,name)values(1,'李四');

insert into member(mid,name)values(2,null);

 

1、增加约束,语法:

ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(字段) 选项...

范例:member表增加主键约束

alter table member add constraint pk_mid primary key(mid);

alter table member add constraint nk_name not null(name);

如果要想为字段增加非空约束,那么只能够依靠修改表结构的方式完成。

范例:增加非空约束

alter table member modify(name varchar2(20) not null);

但是需要保证此时name列上没有null

delete from member where name is null;

此时会出现表以更改

alter table member modify (name varchar2(20) not null);

         删除约束,语法

ALTER TABLE 表名称 DROP CONSTRAINT 约束名称;

删除主键约束

ALTER TABLE member DROP CONSTRAINT pk_mid ;

猜你喜欢

转载自404168219.iteye.com/blog/2337636