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; --永久删除表,不会保存在回收站中