来看看更简单的知识点create(以基本表为例)
简单框架:
create table t_name(
col_name type_name constraint,
col_name type_name constraint,
……
);
由框架可以看出create主要分为type数据类型、constraint约束条件(约束条件不是必要)
一、数据类型
1、数值型
number(m,n),定义了由m位有效数字以及n为小数构成的数据(多余部分四舍五入)
范围:m [1,38],n [-84,127]
若设置int型,会转成number
2、字符型
char(m),定义了长度为m字节的字符串(不够补空格,超出报错)
范围:m [1,2000]
varchar2(m),定义了可变长不超过m的字符串(超出可补长)
写法:varchar2(m byte) varchar2(m char)
编码:UTF-8:一个汉字占用3byte,GBK:一个汉字占用2byte
范围:m [1,4000] byte
这是oracle特有的数据类型,它代替了varchar()类型
为什么不直接用varchar2()代替char()就好?
1、varchar2按字符匹配,char()按字符串匹配,char效率更高
2、发生行迁移现象:简单说如下,两个表作为数据空间,当03号数据过长至原表存不下时,会开辟一个新的空间来存储,新空间的地址存在原来的位置(指针)
01 !!!!!! 02 @@@@@@ 03 (0X1234) 0X1234:
#############################################
nchar(m),用于存储unicode字符(不足补空格,超出报错)【与char比较】
范围:m 1~2000 byte(总字节=最大(字符占字节数)*字符数)
nvarchar2(m),定义了不超m的字符串(超出可补长)【与varchar2比较】
范围:m [1,4000] byte
在varchar2基础上屏蔽了数据编码,规定一个汉字占用2byte
3、日期型
date,用于存储日期、时间(最小精确到秒)
timestamp(p),用于存储精度到p的精确时间(最小精确到纳秒)
范围:p [0,9],默认为6
4、大数据类型(少见)
long,存储可变长的超长字符串
范围:1~2G
(可用来存备注)
lob:有四种类型
clob,字符lob,用于存储大量文本信息(数据库字符与客户字符需要转换)
nclob,字符lob,存储大量信息,使用数据库的国家字符集
blob,二进制lob,存储二进制信息,如音频、视频、图像等
bfile,二进制文件lob,存储外部维护文件指针
raw,固定长度二进制数据
范围:1~2000 byte
long raw,可变长度的二进制数据
范围:1~2G
rowid,十六进制串表示的行地址,表中的唯一标识
范围:10 byte
nrowid,二进制数据表的行地址,唯一标识
范围:1~4000 byte
二、完整性约束条件
1、实体完整性
primary key 主码,该字段属性为主属性,不能重复,不能为空值,
写法:
primary key --此方法只能定义一字段为主键
create table t(
id number primary key,
……
);
primary key(col_name) --可定义多字段为主键
create table t(
id number,
……
primary key(id)
);
constraint pk_name primary key(col_name) --可定义别名
create table t(
id number,
……
constraint pk_name primary key(id)
);
(这里隐含了每个基本表只能有一个主键,而主键中可以有多个字段)
解释:为该表的标识,区别每一行的标识
如学生信息中的学号、医院病人看病的流水号等
2、参照完整性
foreign key 外码,该字段属性的来源为另一表中字段的主属性
写法:
(1)前半部分
references t_name(col_name) --跟在其后
create table t(
id number primary key,
name varchar2(20) references st(name),
……
);
foreign key references t_name(col_name)
create table t(
id number primary key,
name varchar2(20),
……
foreign key(name) references st(name)
);
constraint fk_name foreign key(col_name) references t_name(col_name) --定义别名
create table t(
id number primary key,
name varchar2(20),
……
constraint fk_name foreign key(name) references st(name)
);
解释:将该表与另一表相关联,形成主-副(该表)关系
注意,两字段并不一定是按序一 一对应,只要table 2字段sno中内容存在于table 1字段sno内即可
(2)后半部分(级联删除问题)
当主表中被参照部分内容被删除,副表相应部分的操作,默认为禁止删除
on delete cascade
副表内容连同其他数据一起被删除
on delete set null
副表该字段内容置空
3、用户完整性
not null 非空,不能为(null)
写法:not null
create table t(
id number,
name varchar2(20),
age number not null,
……
);
default 默认,当没有值时取给定的默认值
写法:
default ch
default(ch)
create table t(
id number,
name varchar2(20) default('未命名'),
age number default 0,
……
);
unique 不重,该字段属性值不能重复,有点类似主码(允许存在空值)
写法:(同主键)
unique
unique (col_name1,col_name2)
constraint u_name unique (col_name1,col_name2)
解释:unique约束称为唯一性约束,用来标识每一行数据,作用和主键一样
check 检查,规定该字段属性取值范围、格式
写法:
check(col_name (比较运算) ……)
create table t(
id number,
telnum number check(length(telnum) >= 13),
……
);
check(col_name like '……')
create table t(
id number,
password char(6) check(password like '[0-9,a-z,A-Z]'),
……
);
check(regexp_like(col_name,'……')) --正则表达,比like更能表示
create table t(
id number,
password char(6) check(regexp_like(password, '[0-9,a-z,A-Z]')),
……
);
(正则在此不详细说,后续会出)
4、完整性约束建立、修改、限制、删除
add:
alter table t add cons_type(col_name);
alter table t add constraint cons_name cons_type(col_name);
not null约束不能使用add
modify:
alter table t modify constraint cons_name cons_type(col_name);
启用/禁用:
alter table t enable constraint cons_name;
alter table t disable constraint cons_name;
drop:
alter table t drop constraint cons_name;
not null约束使用modify改为null即为删除
04完