SELECT * FROM tb_clazz;
SELECT * FROM tb_student;

INSERT INTO tb_clazz(code,NAME,bzr) VALUES('1401','14计算机1班','廖老师');
INSERT INTO tb_clazz(code,NAME,bzr) VALUES('1402','14计算机2班','谢老师');

INSERT INTO tb_student(ID,NAME,sex,age,phone,email,address)
VALUES(1,'周杰伦','男',31,'123','jack@qq.com','台湾');
INSERT INTO tb_student(ID,NAME,sex,age,phone,email,address)
VALUES(2,'林志玲','女',41,'123','lzl@qq.com','台湾');
-- 以下数据丧失数据完整性
INSERT INTO tb_student(ID,NAME,sex,age,phone,email,address)
VALUES(3,null,'妖',200,'123','lzl@qq.com','台湾');

/**
大部分数据库支持下面几类完整性约束:
CHECK 检查约束
-- NOT NULL 非空约束(特殊的检查约束)
UNIQUE KEY 唯一约束
PRIMARY KEY 主键约束
FOREIGN KEY 外键约束
*/

-- 建表时,直接在列后面创建约束,称为列级约束,数据库会默认分配唯一的约束名SYS_624
CREATE TABLE tb_student(
ID INT,
NAME VARCHAR(18) NOT NULL,
sex CHAR(3) CHECK(sex = '男' OR sex = '女'),
age INT CHECK(age > 15 AND age < 50),
phone VARCHAR(18) UNIQUE,
email VARCHAR(50) UNIQUE,
address VARCHAR(100)
);

SELECT * FROM tb_student;

INSERT INTO tb_student(ID,NAME,sex,age,phone,email,address)
VALUES(1,'周杰伦','男',31,'123','jack@qq.com','台湾');

-- 查询两条相同数据
INSERT INTO tb_student(ID,name,sex,age,phone,email,address)
VALUES(1,'林志玲','女',41,'111','lzl@qq.com','台湾');

INSERT INTO tb_student(ID,name,sex,age,address)
VALUES(1,'林志玲','女',41,'台湾');

-- 删除其中一条数据,发现无法唯一确定某一条记录
DELETE FROM tb_student WHERE

/*******************主键**************************/
/**
重点
格式 PRIMARY KEY
作用:用来唯一确定一行记录
(1)主键是表中唯一确定一行数据的字段,主键从功能上看相当于非空且唯一
(2)一个表中只允许一个主键
(3)主键字段可以是单字段或者是多字段的组合
(4)当建立主键约束时,Oracle为主键创建对应的索引
(5)现代数据库建模,建议一张表一定要有主键,并且主键应该和业务数据无关,建议使用自动增长的自然数。
*/
CREATE TABLE tb_student(
ID INT PRIMARY KEY,
NAME VARCHAR(18) NOT NULL,
sex CHAR(3) CHECK(sex = '男' OR sex = '女'),
age INT CHECK(age > 15 AND age < 50),
phone VARCHAR(18) UNIQUE,
email VARCHAR(50) UNIQUE,
address VARCHAR(100)
);

-- 因为主键非空并且唯一,所以插入时必须插入,并且不能相同
INSERT INTO tb_student(ID,name,sex,age,address)
VALUES(1,'林志玲','女',41,'台湾');
INSERT INTO tb_student(ID,name,sex,age,address)
VALUES(2,'林志玲','女',41,'台湾');
-- 删除其中一条数据,根据主键id删除
DELETE FROM tb_student WHERE ID = 2;

/*****************外键****************************/
-- 保存学生数据时需要知道学生的班级情况
CREATE TABLE tb_student(
ID INT PRIMARY KEY,
NAME VARCHAR(18) NOT NULL,
sex CHAR(3) CHECK(sex = '男' OR sex = '女'),
age INT CHECK(age > 15 AND age < 50),
phone VARCHAR(18) UNIQUE,
email VARCHAR(50) UNIQUE,
address VARCHAR(100),
clazzcode VARCHAR(18),
clazzname VARCHAR(18),
clazzbzr VARCHAR(18)
);
SELECT * FROM tb_student;

INSERT INTO tb_student(ID,NAME,sex,age,phone,email,address,clazzcode,clazzname,clazzbzr)
VALUES(1,'周杰伦','男',31,'123','jack@qq.com','台湾','1401','14计算机1班','廖老师');

INSERT INTO tb_student(ID,name,sex,age,phone,email,address,clazzcode,clazzname,clazzbzr)
VALUES(2,'林志玲','女',41,'111','lzl@qq.com','台湾','1402','14计算机2班','廖老师');
/*
以上数据库插入数据问题:如果有100人在1401班,则100人的clazzcode,clazzname,clazzbzr信息
完全一致,一个学生的clazzcode,clazzname,clazzbzr信息存储需要17个字节,100个学生需要17*100个字节,
而这些信息基本属于重复的(数据冗余),浪费存储空间。

解决数据冗余问题使用外键。
关系数据库就是指两个表通过外键产生关联关系。
例如:通过tb_student表的clazz_id列让tb_clazz表和tb_student表产生了关联的关系。
*/
CREATE TABLE tb_clazz(
ID INT PRIMARY KEY,
CODE VARCHAR(18),
NAME VARCHAR(18),
bzr VARCHAR(18)
);
INSERT INTO tb_clazz(id,code,NAME,bzr) VALUES(1,'1401','14计算机1班','廖老师');
INSERT INTO tb_clazz(id,code,NAME,bzr) VALUES(2,'1402','14计算机2班,'谢老师');

CREATE TABLE tb_student(
ID INT PRIMARY KEY,
NAME VARCHAR(18) NOT NULL,
sex CHAR(3) CHECK(sex = '男' OR sex = '女'),
age INT CHECK(age > 15 AND age < 50),
phone VARCHAR(18) UNIQUE,
email VARCHAR(50) UNIQUE,
address VARCHAR(100),
clazz_id INT REFERENCES tb_clazz(ID)
);
INSERT INTO tb_student(ID,NAME,sex,age,phone,email,address,clazz_id)
VALUES(1,'周杰伦','男',31,'123','jack@qq.com','台湾',1);

INSERT INTO tb_student(ID,name,sex,age,phone,email,address,clazz_id)
VALUES(2,'林志玲','女',41,'111','lzl@qq.com','台湾',1);

SELECT * FROM tb_clazz;
SELECT * FROM tb_student;

/**
格式 FOREIGN KEY (外键列名) REFERENCES 主表(参照列)
作用:外键是构建于一个表的两个字段或者两个表的两个字段之间的关系,解决数据冗余(多余)问题。
例如:通过clazz_id字段将tb_claz表和tb_student表关联起来。

clazz_id INT REFERENCES tb_clazz(ID)

外键要注意的问题:
1.子(从)表[tb_student]外键列[clazz_id]的值必须在父(主)表[tb_clazz]参照列[id]值的范围内,
或者为空(也可以加非空约束,强制不允许为空)。

2.外键[clazz_id]参照的只能是主表[tb_clazz]主键或者唯一键,保证子表记录可以准确定位到被参照的记录。
3.当主表[tb_clazz]的记录被子表[tb_student]参照时,主表记录不允许被删除。
4.建表时可以增加以下设置:
(1)ON DELETE CASCADE:当父表中的行被删除的时候,同时删除在子表中依靠的行

clazz_id INT REFERENCES tb_clazz(ID) ON DELETE CASCADE

(2)ON DELETE SET NULL:将依靠的外键值转换为空值

clazz_id INT REFERENCES tb_clazz(ID) ON SET NULL
*/

-- 1.子(从)表[tb_student]外键列[clazz_id]的值必须在父(主)表[tb_clazz]参照列[id]值的范围内,
-- 或者为空(也可以加非空约束,强制不允许为空)。
INSERT INTO tb_student(ID,name,sex,age,phone,email,address,clazz_id)
VALUES(3,'柳岩','女',36,'222','ly@qq.com','台湾',9);

-- 2.外键[clazz_id]参照的只能是主表[tb_clazz]主键或者唯一键,保证子表记录可以准确定位到被参照的记录。
-- 反证法证明,tb_clazz参照的不是主键也不是唯一键,会出现的问题
CREATE TABLE tb_clazz(
ID INT ,
CODE VARCHAR(18),
NAME VARCHAR(18),
bzr VARCHAR(18)
);
INSERT INTO tb_clazz(id,code,NAME,bzr) VALUES(1,'1401','14计算机1班','廖老师');
INSERT INTO tb_clazz(id,code,NAME,bzr) VALUES(1,'1402','14计算机2班','谢老师');

CREATE TABLE tb_student(
ID INT PRIMARY KEY,
NAME VARCHAR(18) NOT NULL,
sex CHAR(3) CHECK(sex = '男' OR sex = '女'),
age INT CHECK(age > 15 AND age < 50),
phone VARCHAR(18) UNIQUE,
email VARCHAR(50) UNIQUE,
address VARCHAR(100),
clazz_id INT
);
INSERT INTO tb_student(ID,NAME,sex,age,phone,email,address,clazz_id)
VALUES(1,'周杰伦','男',31,'123','jack@qq.com','台湾',1);

SELECT * FROM tb_clazz;
SELECT * FROM tb_student;
-- 3.当主表[tb_clazz]的记录被子表[tb_student]参照时,主表记录不允许被删除。
DELETE FROM tb_clazz WHERE ID = 1;
-- 解决方案1:先删除子表数据,再删除父表数据
DELETE FROM tb_student WHERE clazz_id = 1;
-- 解决方案2:先将子表关联数据设置为null,再删除父表数据
UPDATE tb_student SET clazz_id = NULL WHERE clazz_id = 1;
-- 解决方案3:先将子表数据修改,再删除父表数据
UPDATE tb_student SET clazz_id = 2 WHERE clazz_id = 1;

-- 4. ON DELETE CASCADE指当删除父表数据时,级联删除子表数据,对应上面的方案1
-- ON SET NULL 指当删除父表数据时,将关联的数据设置为null,对应上面的方案2

Oracle数据库的SQL语句之完整性约束——基础篇的更多相关文章

  1. Oracle数据库的sql语句性能优化

    在应用系统开发初期,由于开发数据库数据比较少,对于查询sql语句,复杂试图的编写等体会不出sql语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目 ...

  2. Oracle数据库高效sql语句的整理

    业务需求说明:由于之前公司后台APP端有一个document表,该表中包含了所有的信息,新的需求就是通过该表创建出一个新的用户表(usertable)和一个档案表(document,该表只保留原doc ...

  3. oracle数据库常用SQL语句(11.29更新)

    笔者日常工作中常用到的sql语句,现总结如下,留作日后查看. 1.按照两列中的最大值取 ,只取两列其中的一列 SELECT * FROM t_doc T ORDER BY GREATEST(T.Loa ...

  4. Oracle数据库常用Sql语句大全

    一,数据控制语句 (DML) 部分 1.INSERT  (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSE ...

  5. Oracle数据库入门——sql语句和函数详解

    一.oracle常用数据类型 一.  数据定义语言(ddl) 数据定义语言ddl(data definition language)用于改变数据库结构,包括创建.更改和删除数据库对象. 用于操纵表结构 ...

  6. oracle数据库常用SQL语句

    1)删除表的一列 ALTER TABLE 表名 DROP COLUMN 列名; 2)增加表的一列 且默认值为0 alter table 表名 add 字段名 类型 default '0'; 3)修改表 ...

  7. Python使用cx_Oracle模块操作Oracle数据库--通过sql语句和存储操作

    https://www.jb51.net/article/125160.htm?utm_medium=referral  Python使用cx_Oracle调用Oracle存储过程的方法示例 http ...

  8. oracle数据库入门sql语句

    数据库: 命名规范问题 依然是 _流.看来也确实应该抽空 来处理一下 今天吧,不行时间不能浪费.要更加专注.累了 就睡,醒来 就 好好 弄东西.白天 哪怕累一些,强度 大一些,晚上也可以抽空出去.溜溜 ...

  9. Oracle 数据库常用SQL语句(2)查询语句

    一.SQL基础查询 1.select语句 格式:select 字段 from 表名; 2.where 用于限制查询的结果. 3.查询条件 > < >= <= = != 4.与 ...

随机推荐

  1. YTU 2844: 改错题A-看电影

    2844: 改错题A-看电影 时间限制: 1 Sec  内存限制: 128 MB 提交: 69  解决: 47 题目描述 注:本题只需要提交标记为修改部分之间的代码,请按照C++方式提交. 小平家长为 ...

  2. YTU 2904: B--Faultfinding

    2904: B--Faultfinding 时间限制: 1 Sec  内存限制: 128 MB 提交: 64  解决: 33 题目描述 Do you remember the game in whic ...

  3. YTU 1005: 渊子赛马

    1005: 渊子赛马 时间限制: 1000 Sec  内存限制: 64 MB 提交: 338  解决: 49 题目描述 赛马是一古老的游戏,早在公元前四世纪的中国,处在诸侯割据的状态,历史上称为&qu ...

  4. [QT开发小结]LNK1104: cannot open file ‘gdi32.lib’ 解决方法

    1.环境变量 : Path = ;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin; 添加变量: INCLUDE = C:\Program ...

  5. 区块链共识算法 PBFT(拜占庭容错)、PAXOS、RAFT简述

    共识算法 区块链中最重要的便是共识算法,比特币使用的是POS(Proof of Work,工作量证明),以太币使用的是POS(Proof of Stake,股权证明)使得算理便的不怎么重要了,而今PO ...

  6. 避免表单重复提交(js实现) (转)

    <script language="javascript">       function submitForm(obj){            obj.disabl ...

  7. 将多个jar合并为一个jar

    有时候,我们需要将多个jar合并为一个jar,ant提供了这样的一个功能 build.xml文件如下 执行以上任务会将 当前目录下的 mysql.jar,commons-io.jar合并为一个 all ...

  8. 运算符:三目运算符,运算符优先级,sizeof,自增自减,取余

    一://---------运算符-----------// 1.运算符是告诉编译程序执行特定算术或逻辑操作的符号. 2.按照功能划分: 算术运算符. 关系运算符与逻辑运算符.按位运算符. 3.运算符根 ...

  9. BZOJ_4199_[Noi2015]品酒大会_后缀自动机

    BZOJ_4199_[Noi2015]品酒大会_后缀自动机 Description 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 酒家”和“首席 ...

  10. windows 2003 server 64 位 IIS 6下部署 32位网站

    在 C:\WINDOWS\system32\inetsrv\MetaBase.xml 设置节点 在 开始--->运行--->输入一下代码,回车即可,就会跳出正在安装NET2.0 代码为   ...