SQL基础学习笔记(三)—约束

约束:

一、创建表时,定义约束

create table emp2(
                  id number(10) constraint emp2_id_nn not null,
                  name varchar2(20) not null,
                  salary number(10,2)
                  )
constraint emp2_id_nn  给约束起个名增加阅读性,不写也行,会自动加上sys_XXXX

作用范围:

①列级约束只能作用在一个列上

②表级约束可以作用在多个列上(当然表级约束也可以作用在一个列上)

定义方式:列约束必须跟在列的定义后面,表约束不与列一起,而是单独定义。

注意,非空(not null) 约束只能定义在列上

1.not null约束  列级约束

insert into emp2
values(1001,null,2000)

没有定义not null约束的可以为空,定义了not null不能为空

2.unique约束(唯一约束)  列级、表级约束

insert into emp2
values(1001,null,2000)

写几个,就会插入几个,但是ID只能有一个,所以,添加数据也要加一个约束,不能赋同样的值

create table emp3(
                  id number(10) constraint emp3_id_uk unique,
                  name varchar2(20) constraint emp3_name_nn not null,
                  salary number(10,2),
                  email varchar2(20),
                  --表级约束
                   constraint emp3_email_uk unique(email)
                  )

只有unique约束,而没有notnull约束,是可以赋空值的,且空值,不看做重复内容的标准,也就是只有null可以是重复的,其他值都不可以重复

3.primary key (主键约束)    列级、表级约束

比如在数据库,员工表中查某个人的信息,人名有很多是重复,这就不好查,但每个人的身份证号是唯一的,主键的作用就类似个身份证号

create table emp4(
                  id number(10) constraint emp4_id_pk primary key,
                  name varchar2(20) constraint emp4_name_nn not null,
                  salary number(10,2),
                  email varchar2(20),
                   constraint emp4_email_uk unique(email)
                  )

Name   Type         Nullable Default Comments

------ ------------ -------- ------- --------

ID     NUMBER(10)

NAME   VARCHAR2(20)

SALARY NUMBER(10,2) Y

EMAIL  VARCHAR2(20) Y

主键要求 非空,唯一,相当于自动加上了not null,unique的限制

create table emp5(
                  id number(10) ,
                  name varchar2(20) constraint emp5_name_nn not null,
                  salary number(10,2),
                  email varchar2(20),
                  --表级约束
                   constraint emp5_email_uk unique(email),
                   constraint emp5_id_pk primary key(id)
                  )

4.foreign key(外键)   列级、表级约束

类似两个朋友圈,有一个人属于A圈,也属于B圈,这个人从A圈连接着B圈,那这个人就是个外键

我和C不认识,但是通过B就可以和C认识,这个B就是外键

create table emp6(
                  id number(10) ,
                  name varchar2(20) constraint emp6_name_nn not null,
                  salary number(10,2),
                  email varchar2(20),
                  department_id number(10),
                  --表级约束
                   constraint emp6_email_uk unique(email),
                   constraint emp6_id_pk primary key(id),
                   constraint emp6_dept_id_fk foreign key(department_id) references departments(department_id)
                  )

插入数据时,department_id 必须在departments表中有,才能插入

注意:

ON DELETE CASCADE(级联删除): 当父表中的列被删除时,子表中相对应的列也被删除,也就是departments表中60号部门删除,emp6表中的60部门

的人也全部删除

ON DELETE SET NULL(级联置空): 子表中相应的列置空,也就是departments表中60号部门置空,emp6表中的原60部门的人的部门id为null,但人还在

--级联置空
create table emp7(
                id number(10) ,
                name varchar2(20) constraint emp7_name_nn not null,
                salary number(10,2),
                email varchar2(20),
                department_id number(10),
--表级约束
 constraint emp7_email_uk unique(email),
 constraint emp7_id_pk primary key(id),
 constraint emp7_dept_id_fk foreign key(department_id) references departments(department_id) on delete set null
                   )

5.check约束  列级、表级约束

给salary加check约束

create table emp8(
                id number(10) ,
                name varchar2(20) constraint emp8_name_nn not null,
                salary number(10,2)constraint emp8_salary check(salary > 1500 and salary < 20000),
                email varchar2(20),
                department_id number(10),
--表级约束
 constraint emp8_email_uk unique(email),
 constraint emp8_id_pk primary key(id),
 constraint emp8_dept_id_fk foreign key(department_id) references departments(department_id) on delete set null
                   )

限制salary在(1500,20000)

二、创建表后,增加约束

1.使用 ALTER TABLE 语句:

添加或删除约束,但是不能修改约束

2.有效化或无效化约束

3.添加 NOT NULL 约束要使用 MODIFY 语句

1.添加一个not null约束

alter table emp5
modify (salary number(11,2) not null)

2.删除

alter table emp5
drop constraint emp5_name_nn 

3.添加unique约束

alter table emp5
add constraint emp5_name_uk unique(name)

4.将约束无效化

emp3表有unique约束,使之无效化,但是并没有删除

SQL> alter table emp3
  2  disable constraint emp3_email_uk;

5.有效化,前提是,有效化前,该列的数据要符合被优化的约束的约束条件,比如unique约束,有效化这个约束,就必须保证这个列的数据不能重复

SQL> alter table emp3
  2  enable constraint emp3_email_uk;

6.查询约束

SELECT constraint_name, constraint_type,
search_condition
FROM
user_constraints
WHERE
table_name = 'EMPLOYEES';

7.查询定义约束的列

SELECT constraint_name, column_name
FROM
user_cons_columns
WHERE
table_name = 'EMPLOYEES';

约束需要注意的地方

1). ** 非空约束(not null)只能定义在列级

2). ** 唯一约束(unique)的列值可以为空

3). ** 外键(foreign key)引用的列起码要有一个唯一约束

时间: 2024-10-13 12:15:06

SQL基础学习笔记(三)—约束的相关文章

SQL基础学习笔记(一)

感觉SQL,学的云里雾里的,整理一下笔记吧. SQL语言分为三种: DML: Data Manipulation Language 数据操纵语言 DDL:  Data Definition Language 数据定义语言 DCL:  Data Control Language 数据控制语言 select * (表示查询表中所有的列 ) from employees; select employee_id , last_name,email from employees;(查询指定) SELECT

Java基础学习笔记三 Java基础语法

Scanner类 Scanner类属于引用数据类型,先了解下引用数据类型. 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型 变量名 = new 数据类型(); 每种引用数据类型都有其功能,我们可以调用该类型实例使用其功能. 变量名.方法名(); Scanner类 Scanner类可以完成用户键盘录入,获取到录入的数据. Scanner使用步骤: 导包: import java.util.Scanner; 创建对象实例:Scann

SQL基础学习笔记(五)—序列、索引、同义词

常见的数据库对象 表:基本的数据存储集合,由行和列组成 视图:从表中抽出逻辑上相关的数据集合 序列:提供有规律的数值 索引:提高查询效率 同义词:给对象起别名 (索引和同义词了解即可) 序列sequences 可供多个用户用来产生唯一数值的数据库对象 自动提供唯一的数值 共享对象 主要用于提供主键值 将序列值装入内存可以提高访问效率 如何和创建序列 CREATE SEQUENCE sequence [INCREMENT BY n] --每次增长的数值 [START WITH n] --从哪个值开

SQL基础学习笔记(二)

向表中插入一条数据 <span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>create table emp1 as select employee_id , last_name , hire_date , salary from employees where 1 = 2</strong></span> 需要注意的是,插入的数据,必须和表中数据种类,一一对应 <

JSP实现数据传递(web基础学习笔记三)

get和post的区别: JSP内置对象: 1)out内置对象:out内置对象是在JSP开发过程中使用得最为频繁的对象,然而其使用起来也是最简单的.out对象用于向客户端浏览器输出数                                                         据,out对象常用的方法是:print()或者println()方法,这两个方法用于在页面中打印出字符串信息. 2)request内置对象:request对象,JSP中的request内置对象对应了Ser

SQL基础学习笔记(四)—视图

视图 (view): 视图的作用就是当一个表中的数据并不想对成员全部开放,只针对不同权限的用户开放不同的数据部分,同子图一样,但是子图的修改,父图并 不受影响,而视图,解决了这一问题 依赖于某表创建一个视图 create view empview as select employee_id id, last_name name, salary sal from employees where department_id = 80 更改数据 update empview set salary =

loadrunner基础学习笔记三

运行时设置: 打开运行时设置:任务窗格中-选择回放-点击运行时设置按钮  1 重复执行次数:=2 2 步:控制迭代时间间隔 3 日志设置:指出要在运行测试期间记录的信息量 4 思考时间:可以在controller中设置,在回放时可以忽略 5 vugen 运行时查看器:工具-常规选项-显示-选择 回放期间运行时查看器和自动排列窗口 7 任务窗格-验证回放-开始回放 出错image not found 设置如下 Recording Options-->Recording-->HTTP/HTML L

Oracle学习笔记三 SQL命令

SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)               下面是这四种SQL语言的详细笔记: Oracle学习笔记三 SQL命令(二):SQL操作语言类别 Oracle数据类型 创建表时,必须为各个列指定数据类型 以下是 Oracle 数据类型的类别: 字符数据类型 CHAR类型 当需要固定长度的字符串时,使用 CHAR 数据类型. CHAR 数据类型存储字母数字值. CH

ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎. Razor在减少代码冗余.增强代码可读性和Visual Studio智能感知方面,都有着突出的优势.Razor一经推出就深受广大ASP.Net开发者的喜爱. 1.2 Razor的语法 (1)Razor文件类型:Razor支持两种文件类型,分