创建表 使用create table 表名(字段名 类型,字段名 类型,...)
数据类型:
number类型(数值类型)
整数类型 number(a) 总长度为a
浮点数类型 number(a,b) 总长度为a,小数长度为b,小数位可以不写
varchar2类型(字符类型)
varchar2(ln) ln表示字符的最大长度,实际存储内存长度根据字符大小自动分配,但最大长度不能超过ln
特点:动态分配存储空间,节省空间
char类型 (字符类型)
char(ln) 不管字符数据长度多大,直接开辟ln大小的空间存储数据
特点:存储效率高于varchar2
日期类型
date 保存日期和时间,在数据库中的存储固定为7个字节
timestap 与date的区别是不仅可以保存日期和时间,还能保存小数秒。数据库内部用7或者11个字节存储,如果精度为0,
则用7字节存储,与date类型功能相同,如果精度大于0则用11字节存储
大文本类型
BLOB:二进制大对象,存储在数据库里的大对象,一般是图像声音等文件。
CLOB: 字符型大对象。一般存储大数量文本信息。存储单字节,固定宽度的数据。
主键特点: 非空唯一,用来标识一条数据
1.直接在创建表的字段后使用primary key
2.在创建表的语句的最后面使用 constraints pk_表名_字段名 primary key(字段名);
3.在创建表后使用 alter table 表名 add constraints pk_表名_字段名 primary key(字段名);
删除主键 alter table 表名 drop constraints (主键约束名)pk_表名_字段名;
1.直接在创建表的字段后使用not null关键字
2.在创建表的语句的最后面使用 constraints ck_表名_字段名 check (字段名 is not null);
3.在创建表后使用 alter table 表名 add constraints ck_表名_字段名 check (字段名 is not null);
删除非空约束 alter table 表名 drop constraints (非空约束名)ck_表名_字段名 check (字段名 is not null);
1.直接在创建表的字段后使用check(条件) 比如 sage number(3) check(sage<150 and sage>0);
2.在创建表的语句的最后面使用 constraints ck_表名_字段名 check(条件);
3.在创建表后使用 alter table 表名 add constraints ck_表名_字段名 check (条件);
删除检查约束 alter table 表名 drop constraints (检查约束名)ck_表名_字段名 check (条件);
1.直接在创建表的字段后使用unique 比如 sqq varchar2(30) unique;
2.在创建表的语句的最后面使用 constraints un_表名_字段名 check(条件);
3.在创建表后使用 alter table 表名 add constraints un_表名_字段名 unique(字段名);
删除检查约束 alter table 表名 drop constraints (唯一约束名)un_表名_字段名 unique(字段名);
通过上面的学习,我们已经可以创建一个较为完整的student表,如下所示。
create table student(
sno number(10) primary key, --主键约束
sname varchar2(100) not null, --非空约束
sage number(3) check(sage>0 and sage<150), --检查约束
ssex char(4) check(ssex='男' or ssex='女'), --检查约束
sfav varchar2(500) ,
sbirth date,
sqq varchar2(30) unique --唯一约束
cid number(10) references clazz(cno) --外键约束 下文要讲
)
注意到上文中创建的student表中的cid字段是一个外键约束,通过外键约束使得student表和下面的clazz表联系起来。
create table clazz(
cno number(10) primary key,
cname varchar2(100) not null,
cdesc varchar2(500)
)
那么什么是外键约束呢?
概念:当一张表的某个字段的值需要依赖另外一张表的某个字段的值,则使用外键约束
其中主动依赖的表称为子表,被依赖的表称为父表。外键加在子表中
作用:当在子表中插入的数据在父表中不存在,则会自动报错
1.在子表的字段后直接使用 references 父表名(字段名) 例如 cid number(10) reference clazz(cno);
2.在创建表语句的最后面使用 constraints fk_子表名_字段名 foreign key(字段名) references 父表名(字段名)
3.在创建表后使用 alter table 表名 add constraints fk_子表名_字段名 foreign key(字段名) references 父表名(字段名)
删除外键约束 alter table 表名 drop constraints (外键约束名)fk_子表名_字段名
外键选取: 一般选取父表的主键作为子表的外键
外键缺点:无法直接删除父表数据,除非进行级联删除
级联删除:
使用:在添加外键约束时,使用关键字 on delete cascade
作用:当删除父表数据时,自动删除子表相关所有数据
缺点:无法保留子表历史数据
使用:在添加外键约束时,使用关键字 on delete set null
作用:删除父表数据时,将字表中的依赖字段的值设置为null
注意:子表依赖字段不能添加非空约束
实际开发时解决方法: