Oracle DDL(数据定义语言)
创建表
语法格式: create table 表名( 列1 数据类型 [primary key], 列2 数据类型 default 默认值 [not null], …, constraint 约束名 约束类型(列), …. ); --约束名是自定义的. --Oracle是没有auto_increment关键字,如果要实现主键的自增长就要使用序列来实现。
Oracle的基本数据类型: --字符串 char :定长 name char(10) 'johnny' :占用10个,其他四个以空补全 varchar2 :变长 按照字节进行计算 name varchar2(10) 'johnny' :占用6个 long :2G nchar(按照字符计算) nvarchar2(按照字符进行计算) --数字 number(v1,p1) : v1代表数字的全部长度,p1代表有几个小数位 小数:number(3,2) :最大值 9.99 整数:number(3) :最大值 999 --日期 date : 日期 ,精确到时分秒,与mysql的datetime timestamp:时间戳,精确到秒的后9位 --大数据类型 blob : 存储二级制文件,最大 4G clob : 存储字符串,最大4G
Oracle的约束类型 约束 在数据库开发中,约束是必不可少,使用约束可以更好的保证数据的完整性。在 Oracle 数据库中,约束的类型包括: 主键约束(Primary Key) 非空约束(Not Null) 唯一约束(Unique) 检查性约束(Check) check(xxx in(xxx,xxx)) 外键约束(Foreign Key)foreign key(xxx) references xxx(xxx) --主键约束一般在 ID 上使用,而且本身已经默认了内容不能为空,可以在建表的时候指定。 --非空约束,可以使指定的字段不可以为空。 --唯一约束,可以使指定的字段的内容是唯一的。 --检查约束,可以用来约束字段值的合法范围
drop table person; create table person( id number(10) primary key,--主键约束 name varchar2(200) not null, gender nchar(1) default '男', constraint person_name unique(name),--非空唯一约束 constraint person_gender check(gender in ('男','女')) --检查约束 ); create table person( id number(10) primary key,--主键约束 name varchar2(200) not null, gender number(1) default 1, constraint person_name unique(name),--非空唯一约束 --检查约束 constraint person_gender check(gender in (1,2)) ); ---约束 drop table person; create table person( id number(10) primary key,--主键约束 name varchar2(200) not null unique,--非空唯一约束 gender nchar(1) default '男' check(gender in ('男','女'))--检查约束 ); create table person( id number(10) primary key,--主键约束 name varchar2(200) not null unique,--非空唯一约束 --检查约束 gender number(1) default 1 check(gender in (1,2)) ); --主键列的值不可以重复,也不可以为空
--外键约束 --订单表 一方 --订单项表 多方 外键 --主表:一方 create table orders( id number(10) primary key, price number(10,2), create_date date ); --从表:多方 create table orders_item( id number(10) primary key, item_name varchar2(500), order_id number(10), constraint fk_order_id foreign key(order_id) references orders(id) ); --插入数据 --插入主表 insert into orders values(1,9999.9,sysdate); commit; --插入从表 insert into orders_item values (1,'1111',1); commit; insert into orders_item values (2,'2222',null); commit; --删除数据:先删除从表数据,再删除主表数据 --只要有引用删除不了 delete from orders where id=1; ---============= --级联删除【慎用】 --主表:一方 drop table orders_item; drop table orders; create table orders( id number(10) primary key, price number(10,2), create_date date ); --从表:多方 create table orders_item( id number(10) primary key, item_name varchar2(500), order_id number(10), constraint fk_order_id foreign key(order_id) references orders(id) on delete cascade ); --插入主表 insert into orders values(1,9999.9,sysdate); commit; --插入从表 insert into orders_item values (1,'1111',1); commit; insert into orders_item values (2,'2222',null); commit; --级联删除 delete from orders where id=1; select * from orders_item;
修改表
--添加列--加字段 --语法: alter table 表名 add(列名 数据类型 [not null], …); alter table person add address01 varchar2(300); alter table person add address02 varchar2(300); --修改列的类型 --语法: alter table 表名 modify(列名 数据类型 [not null], …); alter table person modify address01 varchar2(500); --修改列名 --语法: alter table 表名 rename column 旧列名 to 新列名; alter table person rename column address02 to address; --删除列 --语法: alter table 表名 drop(列名 1, 列名 2, …); alter table person drop column address;
复制表
create table 表名 as select 列名 from 表名 [where 条件];
--复制表的结构和数据: --创建一个 emp 表的备份表(复制表的结构和数据) create table person_bak as select * from person; --只复制表的结构: --只复制表的结构 create table person_bak2 as select * from person where 1=2;
删除表
drop table 表名 [purge]; --如果没有指定 purge 参数,被删除的表就会保存在回收站中。
--删除 emp_bak drop table person_bak; --保存在回收站中,可以从回收站中恢复. drop table person_bak2 purge; --永久删除表,不会保存在回收站中