约束

对表中的数据进行限定,保证数据的正确性、有效性和完整性。

6个约束

1. 主键约束Primary Key: 唯一,不能为null
-- 主键约束、和唯一约束不能同时设置
1. 含义:非空且唯一
2. 一张表只能有一个字段为主键
3. 主键就是表中记录的唯一标识 2. 唯一约束Unique :唯一,允许为null
-- 主键约束、和唯一约束不能同时设置
注意:mysql中,唯一约束限定的列的值可以有多个null
3. 检查约束Check:对字段的数据范围进行限制 where后面的限制条件(age>0 and age<100)-- mysql不支持 检查约束
4. 外键约束Foreign Key:两张表之间
用于定义主表和从表之间的关系,外键约束要定义在从表上,主要则必须具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为NULL。 5. 默认约束Default:对字段进行默认值的设置
6. 非空约束Not Null:对字段 是否可以为null进行限制
  • 主键和唯一键的区别:

    • a.主键不能为null,唯一键可以为null
    • b.一张表只能设置一次主键(主键可以是一个,也可以是复合主键),但可以设置多次唯一键

约束分类

- 列级约束
- 6个约束类型(4个+默认、非空)
- 定义在列的后面
- 多个约束之间用空格分割
- 只能应用于一个列 - 表级约束
- 4个(主键、外键、唯一、检查)
- 定义在表的后面
- 多个约束之间用逗号分割
- 应用于一个列或多个列

列级约束

create table student
(
stuNo number(3) primary key, --主键约束
stuName varchar(20) unique ,--非空约束 not null、唯一约束
stuAddress varchar(50) default '陕西西安' check( length(stuAddress)>2 and length(stuAddress)<20 ),--默认约束、check约束
subId number(3)
)

注意事项

①如果一个列有多个约束(且包含default约束),则default约束必须放在第一个

②唯一约束:不适用于null

③check约束:

  • 怎么在where后面写限制语句,就怎么在check()中写。
  • check(gender in ('男','女'));
  • check(age>=0 and age<=100);

④不论违反的是 主键约束,还是唯一约束,在重复插入数据时,都报错:违反唯一约束条件

表级约束

create table student2
(
stuNo number(3),
stuName varchar2(20),
stuAddress varchar2(50),
subId number(3),
constraint PK_stuNo1 primary key(stuNo) ,-- 表级约束
constraint UQ_stuName_subId unique(stuName,subId) , -- 唯一约束作用于两列
constraint CK_stuAddress1 check(length(stuAddress)>2)
);

给列级约束命名

  • constraint 约束名称
  • 命名规则

主键约束: PK _字段名

检查约束: CK _字段名

唯一约束: UQ_字段名

非空约束: NN_字段名

外键约束: FK_子表_父表

默认约束 :一般不需命名

  • 注意事项: 约束名 在当前用户下的所有表之间 共用。
create table student1
(
stuNo number(3) constraint PK_stuno primary key, --主键约束
stuName varchar(20) constraint NN_stuName not null constraint UQ_stuName unique ,--非空约束、唯一约束
stuAddress varchar(50) default '陕西西安' constraint CK_stuAddress check( length(stuAddress)>2 and length(stuAddress)<20 ),--默认约束、check约束
subId number(3)
)

外键约束(完整约束条件)

主键、外键使用注意事项

a.当父表中没有对应的记录时,不能将记录添加到子表

b.不能更改父表中的值而导致子表中的记录孤立

c.子表存在与父表对应的记录,不能从父表中删除该行

d.删除父表前,先删子表

创建外键

--表级约束

create table sub
(
sId number(3) primary key, --外键所指向的列 必须是主键或唯一键
sname varchar(20)
); create table student3
(
stuNo number(3),
stuName varchar2(20),
subId number(3),
constraint FK_student3_sub foreign key(subId) references sub(sId) –- 表级外键约束
);

--列级约束

CREATE TABLE  table_name
(
column_1 datatype ,
column_2 datatype CONSTRAINT fk_column REFERENCES parent_table (column_name),
...
);

级联置空、级联删除

参考on update cascade 和on delete cascade 作用区别

on delete cascade -- 级联删除 当父表中的列被删除时,同时会自动删除子表中对应的记录。

on delete set null -- 级联置空 当父表中的列被删除时,同时会将子表中对应字段设置为null。

  • 在子表中设置
create table student4
(
stuNo number(3),
stuName varchar2(20),
subId number(3),
constraint FK_student4_sub foreign key(subId) references sub(sId)
--级联删除on delete cascade
on delete set null -- 级联置空
);

追加约束

主键约束

-- 追加
alter table student add CONSTRAINT PK_stuNo PRIMARY key (stuNo);
-- 删除
alter table student drop constraint PK_stuNo; --oracle
alter table student drop PRIMARY key; -- mysql

唯一约束

-- 追加
alter table student add constraint UQ_name UNIQUE(stuName);
ALTER TABLE student MODIFY stuName VARCHAR(255) UNIQUE; -- mysql下追加唯一约束的另一种写法
-- 删除
alter table student drop constraint UQ_name; -- oracle
ALTER TABLE student DROP INDEX UQ_name; -- mysql

mysql下的唯一约束



检查约束

-- mysql
CREATE TABLE `student` (
`stuNo` int(11),
`stuName` varchar(255),
`stuAge` int(11),
`classId` int(11),
constraint CK_stuAge check(stuAge > 18)
);
-- 可以执行追加检查约束的sql语句,但是不生效,包括 列级的检查约束 表级的检查约束 都不生效
alter table student add constraint CK_stuAge check(stuAge > 18);
insert into student(stuNo,stuAge,classId) value (4,16,1); -- 该数据正常插入 alter table student drop constraint CK_stuAge; -- 不对
ALTER TABLE student DROP check CK_stuAge; -- 不对

mysql检查约束无效可参考 mysql check约束无效

外键约束

-- mysql
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称); -- 追加外键
alter table student add constraint FK_student_class foreign key(classId) references class(classId) ; insert into student(stuNo,stuName,stuAge,classId) value (3,'zs',23,1);
insert into student(stuNo,stuName,stuAge,classId) value (3,'ls',23,6); ALTER TABLE 表名 DROP FOREIGN KEY 外键名称; --删除外键
ALTER TABLE student DROP FOREIGN KEY FK_student_class;

非空约束

-- oracle
alter table student MODIFY stuName CONSTRAINT nn_stuName not null;
alter table student drop CONSTRAINT nn_stuName; -- mysql
alter table student MODIFY stuName varchar(255) not null;
alter table student MODIFY stuName varchar(255);

默认约束

-- oracle
alter table student modify stuName default '0000' ;
alter table student modify stuname default null ; -- mysql
alter table student MODIFY stuName varchar(255) default '111111'; -- 设置默认约束
alter table student modify stuName varchar(255) default null ; -- 删除默认约束 将默认值设置为null,就相当于删除了默认约束。 -- 什么情况下字段会被赋予默认值
insert into student(stuNo,stuAge,classId) value (3,23,1); -- stuName 会被赋予默认值
insert into student(stuNo,stuName,stuAge,classId) value (3,null,23,1);-- stuName 是null

mysql查询约束

1.查询约束:SELECT * FROM information_schema.`TABLE_CONSTRAINTS`;(可以通过where table_name='student'来约定只查询某个表的约束)

其实每次添加约束都是将添加的约束的信息存储到了information_schema这个schema的table_constraints表里;(mysql里``和bash的很像,也是执行``内的表达式而不是将里面作为字符串使用)

完整性约束

- 域完整性:对“列”的数据进行限制
- 实体完整性:对“行”的数据进行限制
- 引用完整性:多张表的数据 进行限制(外键)
- 自定义完整性:开发者自己定义的 约束条件 (通过触发器实现)

sql-DDL-约束的更多相关文章

  1. SQL Server - 约束 CONSTRAINT

    总结 约束放置在表中,以下五种约束: NOT NULL 非空约束C 指定的列不允许为空值 UNIQUE 唯一约束U 指定的列中没有重复值,或该表中每一个值或者每一组值都将是唯一的 PRIMARY KE ...

  2. SQL PRIMARY KEY 约束\SQL FOREIGN KEY 约束\SQL CHECK 约束

    SQL PRIMARY KEY 约束 PRIMARY KEY 约束唯一标识数据库表中的每条记录. 主键必须包含唯一的值. 主键列不能包含 NULL 值. 每个表都应该有一个主键,并且每个表只能有一个主 ...

  3. SQL CREATE TABLE 语句\SQL 约束 (Constraints)\SQL NOT NULL 约束\SQL UNIQUE 约束

    CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL CREATE TABLE 语法 CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据 ...

  4. 扩展Exception,增加判断Exception是否为SQL引用约束异常方法!

    在设计数据表时,如果将某些列设置为关联其它表的外键,那么如果对其进行增加.修改操作时,其关联表若没有相匹配的记录则报错,或者在对其关联表进行删除时,也会报错,这就是外键约束的作用,当然除了外键还有许多 ...

  5. 常用SQL DDL语句

    常用SQL DDL语句 DDL-数据库定义语言:直接提交的.CREATE:用于创建数据库对象.DECLARE:除了是创建只在过程中使用的临时表外,DECLARE语句和CREATE语句非常相似.唯一可以 ...

  6. 基础篇 - SQL 的约束

    基础篇 - SQL 的约束       约束 一.实验简介 约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性.本节实验将在实践操作中熟悉 MySQL 中的几种约束. 二 ...

  7. SQL CHECK 约束

    SQL CHECK 约束 CHECK 约束用于限制列中的值的范围. 如果对单个列定义 CHECK 约束,那么该列只允许特定的值. 如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限 ...

  8. SQL UNIQUE 约束

    SQL UNIQUE 约束 UNIQUE 约束唯一标识数据库表中的每条记录. UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证. PRIMARY KEY 拥有自动定义的 ...

  9. SQL数据库约束、默认和规则

    数据的完整性 实体完整性 又称为行完整性,即数据库中的所有行都具有一个非空且没有重复的主键值 MSSQL中通过唯一索引.PRIMARY KEY约束.UNIQUE约束.INDENTITY属性等来强制主键 ...

  10. MySQL笔记(五)MySQL 角色与SQL CHECK约束

    MySQL ROLE MySQL 8.0 Reference Manual  /  Security  /  MySQL User Account Management  /  Using Roles ...

随机推荐

  1. 关闭Mac的Microsoft AutoUpdate

    最近使用Office 发现AutoUpdate一直会启动.我也不需要里面的更新.每次还要把它推出. 网上看到有两种方法,一种是暴力删除,另一种是通过权限限制. 暴力可不是我喜欢的方式,所以选择后者. ...

  2. Codeforces Round #677 (Div. 3) D. Districts Connection思维1200

    题目链接 Problem - 1433D - Codeforces 题目 美好的一天,从看不懂题目开始~~ Example input 4 5 1 2 2 1 3 3 1 1 1 4 1 1000 1 ...

  3. 将个人项目发布到mavan中央仓库

    第一步,准备自己的git代码 比如在gitee或者github上的代码,我的是gitee码云上的,开源了一个处理业务日志采集的组件,支持注解方式,支持SpEL表达式,支持变量自定义. 话不多说,直接上 ...

  4. 使用 HTML5 input 类型提升移动端输入体验(转翻译)

    在过去的几年里,在移动设备上浏览网页已变得难以置信的受欢迎. 但是这些设备上的浏览体验,有时遗留很多的有待改进.当涉及到填写表单时,这一点尤为明显.幸运的是,HTML5规范引入了许多新input类型, ...

  5. Envoy熔断限流实践(二)Rainbond基于RLS服务全局限流

    Envoy 可以作为 Sevice Mesh 微服务框架中的代理实现方案,Rainbond 内置的微服务框架同样基于 Envoy 实现.本文所描述的全局限速实践也是基于 Envoy 已有的方案所实现. ...

  6. Enum枚举类型实战总结,保证有用!

    一般在我们开发时如果能使用枚举罗列的,一般都会定义一个枚举类型.将枚举类型作为方法的参数,可以方便的进行调用,给我们带来不少的遍历,当然有时候它还不如直接用一个int类型带来,带来一定灵活性.但只要能 ...

  7. 动态SQL常用标签

    动态 SQL 目的:为了摆脱在不同条件拼接 SQL 语句的痛苦 在不同条件在生成不同的SQL语句 本质上仍然是SQL语句,不过是多了逻辑代码去拼接SQL,只要保证SQL的正确性按照格式去排列组合 可以 ...

  8. ZooKeeper 基本原理你懂了么?

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 作者:阿凡卢来源:cnblogs.com/luxiaox ...

  9. 离谱的 CSS!从表盘刻度到艺术剪纸

    某日,群里有这样一个问题,如何实现这样的表盘刻度: 这其实是个挺有意思的问题,方法也有很多. 单标签,使用 conic-gradient 实现表盘刻度 最简单便捷的方式,就是利用角向渐变的方式 con ...

  10. 撸了一个 Feign 增强包 V2.0 升级版

    前言 大概在两年前我写过一篇 撸了一个 Feign 增强包,当时准备是利用 SpringBoot + K8s 构建应用,这个库可以类似于 SpringCloud 那样结合 SpringBoot 使用声 ...