Oracle-创建表和表的约束

Oracle-创建表和表的约束

创建表

依据SQL99标准, oracle创建表的语法当然和MySQL等数据库差不多。
那么我们在创建表时注意的应该就是Oracle的类型了。

先简单创建一个表:

drop table if exists users;
create table users(
   id int(5) auto_increment primary key,
   name varchar(4) not null,
   birthday date default '2015-4-27'
);

对表进行重命名:
rename emp to emps;

对表进行重命名:
rename emp to emps;

-> 依据其他表结构,创建emp表的结构,但不会插入数据
create table emp
as
select * from xxx_emp where 1<>1;
-> 创建表时复制其他表的内容
create table emp
as
select * from xxx_emp where 1=1; // 注意:where不写的话,默认为true

依据xxx_emp表,只创建emp表,但不复制数据,且emp表只包括empno,ename字段
create table emp(empno,ename)
as
select empno,ename from xxx_emp where 1=2;
-> 摧毁表的内容,但不改变表的结构
truncate table emp;

Orale的数据类型

Oracle的数据类型很多:VARCHAR2、NVARCHAR2、NUMBER、DATE、TIMESTAMP 、LONG。。
具体去查看Oracle的文档。
这里拿出来几个常用的探讨一下。

1)NUMBER(p,s)
文档中是这样描述的:Number having precision p and scale s. The precision p can range from 1 to 38. The scale s can range from -84 to 127.

拿我们比较常用的来说:
example1: number(5) -> 5表示最多存99999
example2: number(6,2) 这个就有点意思了:
其中2表示最多显示2位小数,采用四舍五入,不足位数补0, (在sqlplus中同时要设置col … for …), 其实就是和显示有关

其中6表示小数+整数不多于6位 -> 其中整数位数不得多于4位,可以等于4位

2)VARCHAR2(size)
拿varchar2(8)来说-> 8表示字节, 即不同的编码,存的数据时不一样的, 例如使用GBK编码, 那么最多就存4个字符了。

这和MySQL是不同的, MySQL的varchar(8)中的8表示的是字符。

3)DATE
即日期, 官方文档给的范围是:January 1, 4712 BC to December 31, 9999 AD (不要问我什么意思, 我也不知道,其实也没必要知道!)
但是,日期的默认格式是这种:’27-4月-15’

4)CLOB【Character Large OBject】:大文本对象,即超过65565字节的数据对象,最多存储4G
5)BLOB【Binary Large OBject】:大二进制对象,即图片,音频,视频,最多存储4G

操作表的命令

在sqlplus中:

将表放入回收站
drop table users;

查询回收站中的对象
show recyclebin;

闪回,即将回收站还原
flashback table 表名 to before drop;
flashback table 表名 to before drop rename to 新表名;

彻底删除users表
drop table users purge;

清空回收站
purge recyclebin;

修改表的结构 alter

依据SQL99标准,和MySQL等数据库都差不多。

增加列:
为emp表增加image列,alter table 表名 add 列名 类型(宽度)
alter table emp add image blob;

修改列:
修改ename列的长度为20个字节,alter table 表名 modify 列名 类型(宽度)
alter table emp modify ename varchar2(20);

删除列:
alter table emp drop column image;

重命名列:
alter table emp rename column ename to username;

drop table 和 truncate table 和 delete from 区别:

drop table
1)属于DDL
2)不可回滚
3)不可带where
4)表内容和结构删除
5)删除速度快

truncate table
1)属于DDL
2)不可回滚
3)不可带where
4)表内容删除
5)删除速度快

delete from
1)属于DML
2)可回滚
3)可带where
4)表结构在,表内容要看where执行的情况
5)删除速度慢,需要逐行删除

修改表需要注意的地方

1)修改表时,不会影响表中原有的数据(我们在没设置数据的情况下)
2)修改表不可回滚

经典的笔试题:有【1000亿】条会员记录,如何用最高效的方式将薪水字段清零,其它字段内容不变?
第一:从emp表中删除sal字段
alter table emp
drop column sal;
第二:向emp表中添加sal字段,且内容默认0
alter table emp
add sal number(6) default 0;

表的约束

依据SQL99标准,和MySQL等数据库都差不多。

例如:primary key、not null、unique、default、foreign key
范例:

create table orders(
  id number(3) primary key,
  isbn varchar2(6) not null unique,
  price number(3) not null,
  cid number(3),
  --constraint cid_FK foreign key(cid) references customers(id) on delete cascade 
  constraint cid_FK foreign key(cid) references customers(id) on delete set null  
);

由于这个表的字段可能会被其他表引用, 这里在外键列上用到了级联删除,on delete cascade / on delete set null

Oracle特有约束:check

简单的说,就是在插入数据时,检查一下这个数据是不是满足我们定的约束条件。。。。感觉是废话。。。。
拿个例子来说吧:

创建表students,包括id,name,gender,salary字段,使用check约束【性别只能是男或女,薪水介于6000到8000之间】

create table students(
  id number(3) primary key,
  name varchar2(4) not null unique,
  gender varchar2(2) not null check ( gender in ('男','女') ),
  salary number(6) not null check ( salary between 6000 and 8000 )
);

这下懂了不。。。。
这样插就是错的: insert into students(id,name,gender,salary) values(1,’哈哈’,’中’,6000);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值