Oracle表结构&数据类型&约束
1、Oracle 表结构
1.1、创建表名的规范
- 推荐以"t_xxx"
- 不能含有"+- "等非法字符,eg:
sql create table "t-1" (id int);
- 不能以"_"开头,eg:
sql create table "_t" (id int);
- 表名如果不用"",那么全部大写,如果"",严格区分大小写,T_USER和t_user是两个不同的表对象
1.2、查看当前用户所拥有的表
当前用户*
select * from user_tables;
DBA角色
select * from dba_users;
这种以dba_xxx或者user_xxx的数据对象,我们一般称作数据字典!
1.3重命名表
alter table t_user rename to t_student;
rename t_student to t_user;
1.4、重命名列
注意:user是关键字,不要作为表名、列名,如果一定要这么定义,使用""
alter table t_user rename column name to "user";
1.5、添加列
alter table t_user add gender char(1);
alter table t_user add (mail varchar(50), addr varchar(50));
1.6、修改列类型
alter table t_user modify "user" varchar(5);
alter table t_user modify ("user" varchar(15), mail varchar(60));
1.7、删除列
alter table t_user drop column addr;
alter table t_user drop (id, mail);
1.8、表名注释
comment on table t_user is 'user info';
select * from user_tab_comments;
1.9、列名注释
comment on column t_user."user" is 'user real name';
select * from user_col_comments where table_name = 'emp';
1.10、授予其他用户可以修改我的表的表结构权限
grant alter on t_user to pp0419;
2、Oracle 数据类型
2.1、字符
char(2000)
2000个字节(2000个英文,666个汉字——utf8,1000个汉字——gbk)
nchar(1000)
1000个字符(1000个英文,1000个汉字——utf8,1000个汉字——gbk)
varchar2(4000)
4000个字节 (4000个英文,1333个汉字——utf8,2000个汉字——gbk)
nvarchar2(2000)
2000个字符(2000个英文,2000个汉字——utf8,2000个汉字——gbk)
char和nchar是固定长度存储(不足会自动补齐你指定的长度)
varchar和nvarchar是可变长度存储(按实际字符串长度存储)
n表示按字符存储(不加n按字节存储)
drop table t_user;
-- create table t_user (name char(10)); --
-- create table t_user (name nchar(10)); --
-- create table t_user (name varchar2(10)); --
create table t_user (name nvarchar2(10)); --
insert into t_user values ('Tom');
insert into t_user values ('我们');
select * from t_user;
select length(name) from t_user; -- 字符长度
2.2、数值
int/long 存整数
number/float 存小数
number(m, n) 存指定精度的小数
number(5, 2) [-999.99, 999.99]
insert into t_user values (-999.99);
insert into t_user values (999.99);
insert into t_user values (-999.945); -- -999.95
insert into t_user values (-999.995); -- 超出精度
number(5, -2)
create table t_user (salary number(5, -2));
insert into t_user values (12345.99); -- 12300
insert into t_user values (12355.99); -- 12400
注意:没有double!
2.3、时间日期
date 年月日时分秒
timestamp 年月日时分秒毫秒
create table t_user (birth date);
insert into t_user values (sysdate);
create table t_user (birth timestamp);
insert into t_user values (systimestamp);
2.4、二进制
blob binary large object
可以含有图片、影像、文本数据
clob character large object
只能含有文本数据
没有长度限制
3、Oracle 约束
3.1、主键 primary key
唯一约束 + 非空约束
一个表上只能有一个主键
drop table t_user;
create table t_user (
-- id int primary key,
id int constraint pk_id primary key,
name varchar(20)
);
create table t_user (
id int,
name varchar(20),
-- primary key(id)
constraint pk_id primary key(id)
);
alter table t_user add primary key (id);
alter table t_user drop primary key;
alter table t_user drop constraint pk_id;
3.2外键 foreign key
只能引用别人表的主键列或者是有唯一约束的列
drop table t_user cascade constraints; -- 删除主表的同时删除引用本表主键的外键约束(但是外键数据还在)
drop table t_contact;
-- 用户
create table t_user (
id int primary key,
name varchar(20)
);
-- 监护人
create table t_contact (
id int primary key,
name varchar(20),
-- user_id int references t_user(id)
user_id constraint fk_user_id references t_user(id)
);
create table t_contact (
id int primary key,
name varchar(20),
user_id int,
constraint fk_user_id foreign key(user_id) references t_user(id)
);
alter table t_contacts add constraint fk_user_id foreign key (userid) references t_user (id);
alter table t_contact drop constraint fk_user_id;
技巧:删除主键时级联删除外键数据或修改外键值为null
在MySQL也有类似的级联删除外键的操作!!!
drop table t_user cascade constraints; -- 删除主表的同时删除引用本主键的外键约束(但是外键数据还在)
drop table t_contact;
-- 用户
create table t_user (
id int primary key,
name varchar(20)
);
-- 监护人
create table t_contact (
id int primary key,
name varchar(20),
user_id int references t_user(id)
-- on delete cascade -- 级联删除外键数据行
on delete set null -- 外键数据行保留,把外键值改为null
);
insert into t_user values (111, 'tom');
insert into t_user values (112, 'sam');
insert into t_user values (113, 'john');
insert into t_contact values (1, 'ben', 111);
insert into t_contact values (2, 'mike', 111);
insert into t_contact values (3, 'sophia', 112);
delete from t_user where id = 111;
select * from t_contact;
3.3、组合主键/组合外键(了解)
create table t_user (
id int,
name varchar2(10),
gender char(1),
primary key(id, name) -- id和name值的组合不能重复,且两个列都不能为null
);
create table t_contact (
name varchar2(10),
cid int,
cname varchar2(10),
constraint cfk_cid_cname foreign key (cid, cname) references t_user(id, name)
);
3.4、唯一 unique
一个表中可以有多个列定义唯一约束
唯一约束的值可以为null
唯一可以被外键引用(因为有时主键已被其他列定义)
create table t_user (
id int primary key,
-- name varchar2(10) unique
/*
name varchar2(10),
unique(name)
*/
-- constraint uq_name unique(name)
);
alter table t_user add constraint uq_name unique(name);
3.5、组合唯一
create table t_user (
id int,
name varchar2(10),
gender char(1),
unique(id, name) -- id和name值的组合不能重复,但是某个列可以为null
);
3.6、非空 not null
不需要使用constraint关键字去创建(直接通过表结构就可以定义了)
-- 直接通过表结构定义或修改
create table t_user (
id int primary key,
name varchar(20) not null
);
alter table t_user modify name varchar(10) null;
-- 通过constraint约束形式
create table t_user (
id int primary key,
name varchar(20) constraint not_null_name not null
);
alter table t_user drop constraint not_null_name;
desc t_user;
3.7、检查 check
check(SQL表达式)
可以对值的大小、范围、引用都可以进行限定
create table t_user (
id int,
name varchar(10),
mobile varchar(11),
-- check(length(mobile) = 11)
constraint ck_mobile check(length(mobile) = 11)
);
create table t_user (
id int,
name varchar(10),
-- gender char(1) check(gender in ('M', 'F'))
-- age int check(age between 18 and 30)
-- age int check(age >= 18 and age <= 30)
-- mobile char(11) check(mobile like '1%') -- 注意定长不适用于length检查
mobile varchar(11) check(length(mobile) = 11)
);
检查引用关系的写法
create table t_user (
id int,
name varchar(10),
hiredate date, -- 入职时间
firedate date, -- 离职时间
-- firedate date check(firedate >= hiredate) -- ERROR
constraint ck_firedate check(firedate >= hiredate) -- 雇员的离职时间(不能定义为行内约束写法,必须新行定义)
);
注意:针对于一个列可以同时存在多个检查约束(注意约束之间可能有冲突)
create table t_user (
age int check (age between 18 and 40)
);
alter table t_user add constraint ck_age check (age between 16 and 30);
select * from user_constraints where table_name = 'T_USER';
insert into t_user values (31); -- ERROR
默认 default
create table t_user (
id int,
name varchar(10) default 'unknown'
);
insert into t_user values (1, 'tom');
insert into t_user values (2, '');
insert into t_user values (3, null);
insert into t_user (id) values (4);
insert into t_user values (5, default);
select * from t_user;
alter table t_user modify name varchar(10) default null; -- 取消默认约束
insert into t_user (id) values (6);
3.8、数据字典(约束相关)
select * from user_constraints;
CONSTRAINT_TYPE 列存储的就是约束类型:
C - 检查
P - 主键
R - 外键
U - 唯一
CONSTRAINT_NAME 列存储的就是约束名!
select * from user_constraints where table_name = 'T_USER';
alter table t_user drop constraint SYS_C00111;
采用约束实现三大关联关系
1. 1:1
-- 身份证和护照(有身份证不一定有护照,但是有护照一定有身份证)
create table t_idcard (
id char(18) primary key,
name varchar(20) not null,
gender char(1) not null
);
create table t_passport (
id char(15) primary key,
name varchar(50) not null,
idcard char(18),
constraint fk_idcard foreign key (idcard) references t_idcard(id), -- 外键定义在护照这张表
constraint uq_idcard unique(idcard) -- 唯一关系实现1对1
);
2. 1:M
只要有外键就是多的引用关系
3. M:N
-- 学生选课
create table t_student (
sid int primary key,
sname varchar2(20) not null
);
create table t_course (
cid int primary key,
cname varchar2(10) not null
);
create table r_student_course (
rsid int,
rcid int,
constraint fk_rsid foreign key (rsid) references t_student(sid),
constraint fk_rcid foreign key (rcid) references t_course(cid),
unique(rsid, rcid) -- 不能重复选课
);
posted on 2023-08-08 17:20 JavaCoderPan 阅读(64) 评论(0) 编辑 收藏 举报