Oracle--约束
约束
约束是表一级的限制,是指在表上强制执行的数据校验规则。约束加在某一列
1) 非空约束: 这一列必须赋值 NOT NULL --非空
2) 主键约束: 这一列的值必须唯一, 而且非空, 一张表只能有一个主键约束 PRIMARY KEY --主键
3) 唯一约束: 这一列的值必须唯一,允许有一个null, 一张表可以多个唯一约束 UNIQUE KEY --唯一键
4) 检查约束: 限制值的范围, 性别只能是男或者女 check
5) 默认值约束: 给某列添加一个默认值, 如果没有给这个列赋值, 这一列的值不是null,而是默认值 default
6) 外键约束: A表某一列的数据必须来源与B表中某一列, A表某一列的数据 必须在B表的某一列存在 FOREIGN KEY --外键
创建约束两种方式:
- 在创建表的时候,就创建约束
- 在创建完表之后, 以修改表, 添加约束
一、创建表的时候,就添加约束
第一种写法:
--创建一个 学生表 tb_stu -- 学号 主键约束 -- 姓名 非空约束 -- 性别 非空约束 男or女(check约束) -- 民族 默认值: "汉族" 说明不会出现null 不要加非空约束 -- 身份证 非空约束 唯一 -- 专业编号 必须来源专业表中的数据 外键约束 CREATE TABLE tb_stu( stuNO CHAR(4) PRIMARY KEY, -- 主键约束 sname VARCHAR2(20) NOT NULL, -- 非空约束 sex VARCHAR2(2) DEFAULT '男' CHECK(sex='男' or sex='女'), --检查约束 nation VARCHAR2(20) DEFAULT '汉族', -- 默认值约束 personCode CHAR(18) UNIQUE, -- 唯一约束 -- sc_id char(2) REFERENCES t_school(sc_id) -- 外键约束(外键的表应该先创建) );
第二种写法: 可以给 主键月色, 唯一约束检查约束, 外键约束 起一个名字
/*规范: 主键: pk_表名_列名 唯一: uk_表名_列名 检查约束: ck_表名_列名 外键约束: fk__表名_列名 */ /* 声明好列之后, 添加约束(主键约束, 唯一约束检查约束, 外键约束), 而非空约束,默认值这两个只能在声明列指定 语法: 主键约束, 唯一约束检查 CONSTRAINTS 约束名 约束类型(主键,唯一)(列名) 检查约束 CONSTRAINTS 约束名 check(列名的表达式) 外键约束 A表的a列 引用 B表的b列, A表叫从表, B表:主表 CONSTRAINTS 约束名 FOREIGN KEY(本表列名) REFERENCES 另外一张表名(另外一张表的列名) */
例:
CREATE TABLE tb_stu2( stuNO CHAR(4), sname VARCHAR2(20) NOT NULL, --非空约束 sex VARCHAR2(2) DEFAULT '男' , nation VARCHAR2(20) DEFAULT '汉族', personCode CHAR(18), --添加约束 CONSTRAINTS pk_stuNO PRIMARY KEY(stuNo), CONSTRAINTS ck_sex CHECK(sex ='男' or sex='女'), CONSTRAINTS uk_personCode UNIQUE(personCode) );
一张表不能有两个主键约束
实际开发中, 一般会给表设置 一个id列(数据无意义的, 数字), 把id列设置为主键约束, 把这个id列叫做主键列
CREATE TABLE tb_product( id NUMBER PRIMARY KEY, name VARCHAR2(100) NOT NULL, price NUMBER(9,2) NOT NULL );
联合主键约束, 组合主键
CREATE TABLE tb_score( stuNo char(4), cNO char(2), score number(5,2) check(score >=0 and score <= 100), CONSTRAINTS pk_stuNo_cNo primary key(stuNo,cNo) );
外键约束:
添加数据, 先添加主表的数据,再添加从表的数据
删除数据: 删除主表的数据, 如果这条记录被从表引用, 无法删除
删除被引用的主表的这一条记录, 先删除 从表中的数据, 再删除主表
互联网项目, 提高数据库效率, 一般不会设置外键约束, 外键约束由代码来维护
从表的某一列引用主表的某一列
/* 外键约束 A表的a列 引用 B表的b列, A表叫从表, B表:主表 CONSTRAINTS 约束名 FOREIGN KEY(本表列名) REFERENCES 另外一张表名(另外一张表的列名) */ -- 注意: 1) 创建表的时候, 先创建主表, 再创建从表 -- 2) 从表中引用主表某一列值的这一列要求数据类型与主表的列的数据类型一致 -- 3) 要求主表的被引用的列必须有主键约束或者唯一约束
例:
--专业表(主表) CREATE TABLE tb_major( majorId number primary key, majorName varchar2(100) );-- 学生表(从表) major 引入 tb_major 的majorId -- 要求 major 与majorId 数据类型一样 CREATE TABLE tb_stu4( stuNO CHAR(4), sname VARCHAR2(20) NOT NULL, --非空约束 sex VARCHAR2(2) DEFAULT '男' , nation VARCHAR2(20) DEFAULT '汉族', personCode CHAR(18), major number not null, --专业,引用专业表中列 --添加约束 CONSTRAINTS pk_stuNO PRIMARY KEY(stuNo), CONSTRAINTS ck_sex CHECK(sex ='男' or sex='女'), CONSTRAINTS pk_personCode unique(personCode), --添加外键列 CONSTRAINTS FK_major_majorId FOREIGN KEY(major) REFERENCES tb_major(majorId) );
二:在创建完表之后, 以修改表, 添加约束
修改表
-- alter table 表名 add constraints 约束名 约束类型 alter table t_student add constraints pk_t_student_stuNo primary key(stuNo); insert into t_student(stuNo) values('1001');
删除
--删除约束 -- alter table 表名 drop constraints 约束名; alter table t_student drop constraints pk_t_student_stuNo; --如果表中有数据, 而且数据违反你将要添加的约束, 这个约束添加失败 -- 数据为王, 数据最重要
to_date()
-- 把日期字符串转换为date select to_date('21/09/2017','dd/mm/yyyy') from dual -- 显示的oracle的默认的日期格式