ORACLE数据库的SQL语句之约束——基础篇

/*修改用户密码:
1.输入cmd打开dos窗口
2.sqlplus/nolog
3.conn/as sysdba
4.alter user system identified by orcl;
*/

/**
数据完整性指存储在数据库中的所有数据值均正确的状态。
如果数据库中存储有不正确的数据值,则该数据库称为已丧失数据完整性
*/

CREATE TABLE tb_student(
NAME VARCHAR2(18),
sex CHAR(3),
age INT,
address VARCHAR2(100),
phone VARCHAR2(30)
)

SELECT * FROM tb_student;

--不正确状态数据
INSERT INTO tb_clazz(sex,age,address,phone)VALUES(‘女‘,‘19‘,‘广州‘,‘1390000115‘);
INSERT INTO tb_clazz(NAME,sex,age,address,phone)VALUES(‘alice‘,‘妖‘,‘19‘,‘广州‘,‘1390000115‘);
INSERT INTO tb_clazz(NAME,sex,age,address,phone)VALUES(‘alice‘,‘女‘,‘19‘,‘广州‘,‘1390000115‘);

/**
约束是在表上强制执行的数据校验规则
约束主要用于保证数据库的完整性
大部分数据库支持下面五类完整性约束
UNIQUE Key唯一键
CHECK检查(NOT NULL非空)
*/

/**重点:
PRIMARY KEY主键
作用:主键是表中唯一确定一行数据的字段,主键从功能上看相当于非空且唯一
1.一个表中只允许一个主键
联合主键,主键字段可以是单字段或者是多字段的组合
2.现代数据库建模,建议一张表一定要有主键,并且主键应该和业务数据无关,建议使用自动增长的自然数。

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

/**外键要注意的问题:
1.子(从)表[tb_student]外键列[clazz_id]的值必须在父(主)表[tb_clazz]参照列[id]的范围内。
或者为空(也可以加非空约束,强制不允许为空)
2.外键[clazz_id]参照的只能是主表[tb_clazz]主键或者唯一键,保证子表记录可以准确定位到被参照的记录。
3.当主表[tb_clazz]的记录被子表[tb_student]参照时,主表记录不允许被删除。
解决方案1:先删除关联的子表数据,再删除主表数据
*/
SELECT * FROM tb_student;
ALTER

--先删除主表的ID
DELETE FROM tb_student WHERE clazz_id = 1;
--再删除从表的ID
DELETE FROM tb_clazz WHERE ID = 1;

--解决方案2:先将关联的子表数据修改,再删除主表数据
UPDATE tb_student SET clazz_id = 1 WHERE CLAZZ_ID = 3;
DELETE FROM tb_clazz WHERE ID = 3;

SELECT * FROM tb_student;
SELECT * FROM tb_clazz;

--解决方案3:先将关联的子表数据设置为null,再删除主表数据
UPDATE tb_student SET clazz_id = NULL WHERE clazz_id = 2;
DELETE FROM tb_clazz WHERE ID = 2;

4.建表时可以增加以下设置:
--层叠效果删除CASCADE
(1)ON DELETE CASCADE:当父表中的行被删除的时候,同时删除再子表中依靠的行
--把B表中依靠外键A表的值转换为空值
(2)ON DELETE SET NULL:将依靠的外键值转换为空值,该外键设置为空

/*在建表时直接在列后面创建约束称为列级约束,数据库会默认给约束增加一个唯一
的名称SYS_C007217用于管理**/
DROP TABLE tb_student;

SELECT * FROM tb_student;

CREATE TABLE tb_student(
ID INT PRIMARY KEY,--主键约束
NAME VARCHAR2(30) NOT NULL,--非空约束
sex CHAR(3) DEFAULT ‘男‘ CHECK(sex=‘男‘ OR sex=‘女‘),--检查约束
age INT CHECK(age >6 AND age<149),--检查约束
phone VARCHAR2(11) UNIQUE --唯一约束UNIQUE
);

--测试非空约束
INSERT INTO tb_student(sex,age,phone)VALUES(‘男‘,23,‘15913115996‘);

--测试检查约束
--插入性别为妖,手机号为重复的数据,年龄200
INSERT INTO tb_student(ID,name,sex,age,phone)VALUES(1,‘admin‘,‘妖‘,23,‘15913115996‘);
INSERT INTO tb_student(ID,name,sex,age,phone)VALUES(2,‘admin‘,‘男‘,2000,‘15913115996‘);

--测试唯一约束
INSERT INTO tb_student(ID,name,sex,age,phone)VALUES(1,‘admin‘,‘男‘,‘20‘,‘15913115996‘);
INSERT INTO tb_student(ID,name,sex,age,phone)VALUES(2,‘admin‘,‘男‘,‘20‘,‘15913115996‘);

--为什么要有主键约束?观察插入重复数据
--主键用来保证数据的完整性和唯一性
INSERT INTO tb_student(name,sex,age,phone)VALUES(‘admin‘,‘男‘,‘20‘,‘15913115996‘);
INSERT INTO tb_student(name,sex,age,phone)VALUES(‘admin‘,‘男‘,‘20‘,‘15913115996‘);

--为什么要有外键?
DROP TABLE tb_student;
DROP TABLE tb_clazz;

SELECT * FROM tb_clazz;

CREATE TABLE tb_student(
ID INT PRIMARY KEY,
NAME VARCHAR2(18) NOT NULL,
sex CHAR(3) DEFAULT ‘男‘ CHECK(sex=‘男‘ OR sex=‘女‘),
age INT CHECK(age > 15 AND age <60),
address VARCHAR2(30) UNIQUE,
phone VARCHAR2(30) UNIQUE,
--班级名字,班级编码,班主任
clazz_name VARCHAR2(30),
CODE VARCHAR2(30),
bzr VARCHAR2(30)
);

SELECT * FROM tb_student;
SELECT * FROM tb_clazz;
--这样插入数据会出现数据冗余
--插入数据
INSERT INTO tb_student(ID,NAME,SEX,AGE,ADDRESS,PHONE,CLAZZ_NAME,CODE,bzr)
VALUES(1,‘admin‘,‘男‘,23,‘广州‘,‘15913115996‘,‘j1707‘,‘java就业班‘,‘谢老师‘);

--建立外键关联两个表

--主表 班级表
CREATE TABLE tb_clazz(
ID INT PRIMARY KEY,--如果要设置外键,那么主表必须有一个主键
CODE VARCHAR2(18),
NAME VARCHAR2(18),
bzr VARCHAR2(18)
);

INSERT INTO tb_clazz(id,CODE,NAME,bzr)VALUES(1,‘j1709‘,‘java就业班‘,‘谢老师‘);
INSERT INTO tb_clazz(id,CODE,NAME,bzr)VALUES(2,‘j1710‘,‘java就业班‘,‘李老师‘);
INSERT INTO tb_clazz(id,CODE,NAME,bzr)VALUES(3,‘j1711‘,‘java基础班‘,‘黄老师‘);

--列级约束
CREATE TABLE tb_student(
ID INT PRIMARY KEY,
NAME VARCHAR2(18) NOT NULL,
sex CHAR(3) DEFAULT ‘男‘ CHECK(sex=‘男‘ OR sex=‘女‘),
age INT CHECK(age >15 AND age <60),
address VARCHAR2(100),
phone VARCHAR2(30) UNIQUE,
--班级外键
clazz_id INT,
--外键 (外键名) 引用 主表(主键)
FOREIGN KEY (clazz_id) REFERENCES tb_clazz(ID)
)

INSERT INTO tb_student(ID,NAME,sex,age,address,phone,clazz_id)
VALUES(1,‘admin‘,‘男‘,23,‘广州‘,‘15913115996‘,1);
INSERT INTO tb_student(ID,NAME,sex,age,address,phone,clazz_id)
VALUES(2,‘admin2‘,‘男‘,23,‘广州‘,‘15913115997‘,2);
INSERT INTO tb_student(ID,NAME,sex,age,address,phone,clazz_id)
VALUES(3,‘admin3‘,‘男‘,23,‘广州‘,‘15913115998‘,3);

--插入数据
INSERT INTO tb_student(ID,NAME,sex,age,address,phone,clazz_id)
VALUES(1,‘admin‘,‘男‘,23,‘广州‘,‘15913115996‘,1);
INSERT INTO tb_student(ID,NAME,sex,age,address,phone,clazz_id)
VALUES(2,‘rose‘,‘女‘,21,‘深圳‘,‘15913115997‘,2);

--测试:1.子(从)表[tb_student]外键列[clazz_id]的值必须在父(主)表[tb_clazz]参照列[id]值的范围内
--错误信息:未找到父项关键字,因为现在tb_clazz当中没有id为9的班级
INSERT INTO tb_student(ID,NAME,sex,age,address,phone,clazz_id)
VALUES(3,‘rose‘,‘女‘,21,‘深圳‘,‘15913115998‘,9);

--测试:2.外键[clazz_id]参照的只能是主表[tb_clazz]主键或者唯一键,
--保证子表记录可以准确定位到被参照的记录。
CREATE TABLE tb_clazz1(
ID INT,
CODE VARCHAR2(18),
NAME VARCHAR2(18),
bzr VARCHAR2(18)
);

INSERT INTO tb_clazz1(id,CODE,NAME,bzr)VALUES(1,‘j1509‘,‘java就业班‘,‘谢老师‘);
INSERT INTO tb_clazz1(id,CODE,NAME,bzr)VALUES(1,‘j1508‘,‘java就业班‘,‘李老师‘);

SELECT * FROM tb_clazz;
SELECT * FROM tb_student;

--测试:3.当主表[tb_clazz]的记录被子表[tb_student]参照时,主表记录不允许被删除。
--错误信息:已找到子记录
DELETE FROM tb_clazz WHERE ID = 1;

-- 解决方案2:先将关联的子表数据修改,再删除主表数据
--子表修改的CLAZZ_ID值必须要在主表中的ID值范围内
UPDATE tb_student SET clazz_id = 3 WHERE ID =1;
DELETE FROM tb_clazz WHERE ID = 2;

--(1)ON DELETE CASCADE:当父表中的行被删除的时候,同时删除在子表中依靠的行
--(2)ON DELETE SET NULL:将依靠的外键值转换为空值
--建表时增加

DROP TABLE tb_student;

CREATE TABLE tb_student(
ID INT PRIMARY KEY,
NAME VARCHAR2(18) NOT NULL,
sex CHAR(3) DEFAULT ‘男‘ CHECK(sex=‘男‘ OR sex=‘女‘),
age INT CHECK(age >15 AND age <60),
address VARCHAR2(100),
phone VARCHAR2(30) UNIQUE,
--外键 (外键名) 引用 主表(主键)
FOREIGN KEY (clazz_id) REFERENCES tb_clazz(ID),
--当删除主表数据时要把子表关联的数据设置为空
clazz_id INT REFERENCES tb_clazz(ID) ON DELETE SET NULL
);

DELETE FROM tb_clazz WHERE ID = 1;

SELECT * FROM tb_clazz;
SELECT * FROM tb_student;

原文地址:https://www.cnblogs.com/hellohowlow/p/8261654.html

时间: 2024-11-09 09:17:38

ORACLE数据库的SQL语句之约束——基础篇的相关文章

Oracle数据库常用Sql语句大全

一,数据控制语句 (DML) 部分 1.INSERT  (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, --) VALUES ( 值1, 值2, --); INSERT INTO 表名(字段名1, 字段名2, --)  SELECT (字段名1, 字段名2, --) FROM 另外的表名; 字符串类型的字段值必须用单引号括起来, 例如: 'GOOD DAY' 如果字段值里包含单引号' 需要进行字符串转换, 我们把它替换成两个单引号''. 字符串类型的字段值超过

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

在应用系统开发初期,由于开发数据库数据比较少,对于查询sql语句,复杂试图的编写等体会不出sql语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要问题之一.系统优化中一个很重要的方面就是sql语句的优化.对于海量数据,劣质sql语句和优质sql语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就行,而是要写出高质量的sql语句,提高系统的可用性. Oracle的sql调优第一个复杂的主题,甚至需要长

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

一.oracle常用数据类型 一.  数据定义语言(ddl) 数据定义语言ddl(data definition language)用于改变数据库结构,包括创建.更改和删除数据库对象. 用于操纵表结构的数据定义语言命令有: create table alter table truncate table drop table eg. --创建tb_stu表数据结构 create table tb_stu( id number, name varchar2(20) );   --修改tb_stu表数

Oracle 数据库常用sql语句及知识

<Oracle 数据库> 一.常用sql语句: 1.连接系统管理员账号:conn system/system(安装时口令); 2.创建新账号:create user Leo(账号名) identified by Leo(密码): 3.给新账号授权:grant connect,resource to Leo; 4.从某个账户收权:revoke resource from Leo; 5.连接新账号:conn Leo/Leo; 6.显示当前客户:show user; 7.查看表结构:desc s_e

oracle数据库入门sql语句

数据库: 命名规范问题 依然是 _流.看来也确实应该抽空 来处理一下 今天吧,不行时间不能浪费.要更加专注.累了 就睡,醒来 就 好好 弄东西.白天 哪怕累一些,强度 大一些,晚上也可以抽空出去.溜溜弯儿. 雷哥 问了一个 问题: Char 跟 varchar 有什么区别.如果 char 里面 定了4位.存了 一个 汉字,就是 两位.但是 在数据库空间依然是 4位.后面用空格补齐.但是 varchar 里面 假设定了 4位的长,存了一个 汉字 占了两位,这时候 在数据库中就只占2两位.所以 在空

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

一.SQL基础查询 1.select语句 格式:select 字段 from 表名; 2.where 用于限制查询的结果. 3.查询条件 > < >= <= = != 4.与 或(AND,OR) 5.在 不在(IN,NOT IN) 练习:查询工号为1,9,11,16且工资低于1000的员工. 6.在 [a,b] (between val1 and val2) 查询工资大于1000,小于1500的员工. select * from s_emp where salary between

oracle数据库之sql语句使用

SCOTT E-R模型图 DEPT 部门表             EMP 雇员表               BONUS 奖金表         GRADE 工资等级 DEPTNO 部门编号         EMPNO    雇员编号         ENAME 雇员名称     GRADE  工资等级 DNAME  部门名称        ENAME    雇员名称         JOB 工作职位          LOSAL   最低薪资 LOC    部门位置       JOB  

解决oracle数据库删除sql语句出现^H字样

1:安装readline包 yum install readline* 2:安装源码包: rlwrap-0.30.tar.gz ./configure && make && make install 3:修改oracle用户的环境变量: alias sqlplus='rlwrap sqlplus' alias rman='rlwrap rman'

oracle数据库常用SQL语句

1)删除表的一列 ALTER TABLE 表名 DROP COLUMN 列名; 2)增加表的一列 且默认值为0alter table 表名 add 字段名 类型 default '0'; 3)修改表的字段为NULLALTER TABLE 表名 MODIFY 要修改的字段名字 NULL; 4)修改表的字段名alter table 表名 rename column 原字段名 to 目标字段名;