sql-DDL-约束
约束
对表中的数据进行限定,保证数据的正确性、有效性和完整性。
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-约束的更多相关文章
- SQL Server - 约束 CONSTRAINT
总结 约束放置在表中,以下五种约束: NOT NULL 非空约束C 指定的列不允许为空值 UNIQUE 唯一约束U 指定的列中没有重复值,或该表中每一个值或者每一组值都将是唯一的 PRIMARY KE ...
- SQL PRIMARY KEY 约束\SQL FOREIGN KEY 约束\SQL CHECK 约束
SQL PRIMARY KEY 约束 PRIMARY KEY 约束唯一标识数据库表中的每条记录. 主键必须包含唯一的值. 主键列不能包含 NULL 值. 每个表都应该有一个主键,并且每个表只能有一个主 ...
- SQL CREATE TABLE 语句\SQL 约束 (Constraints)\SQL NOT NULL 约束\SQL UNIQUE 约束
CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL CREATE TABLE 语法 CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据 ...
- 扩展Exception,增加判断Exception是否为SQL引用约束异常方法!
在设计数据表时,如果将某些列设置为关联其它表的外键,那么如果对其进行增加.修改操作时,其关联表若没有相匹配的记录则报错,或者在对其关联表进行删除时,也会报错,这就是外键约束的作用,当然除了外键还有许多 ...
- 常用SQL DDL语句
常用SQL DDL语句 DDL-数据库定义语言:直接提交的.CREATE:用于创建数据库对象.DECLARE:除了是创建只在过程中使用的临时表外,DECLARE语句和CREATE语句非常相似.唯一可以 ...
- 基础篇 - SQL 的约束
基础篇 - SQL 的约束 约束 一.实验简介 约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性.本节实验将在实践操作中熟悉 MySQL 中的几种约束. 二 ...
- SQL CHECK 约束
SQL CHECK 约束 CHECK 约束用于限制列中的值的范围. 如果对单个列定义 CHECK 约束,那么该列只允许特定的值. 如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限 ...
- SQL UNIQUE 约束
SQL UNIQUE 约束 UNIQUE 约束唯一标识数据库表中的每条记录. UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证. PRIMARY KEY 拥有自动定义的 ...
- SQL数据库约束、默认和规则
数据的完整性 实体完整性 又称为行完整性,即数据库中的所有行都具有一个非空且没有重复的主键值 MSSQL中通过唯一索引.PRIMARY KEY约束.UNIQUE约束.INDENTITY属性等来强制主键 ...
- MySQL笔记(五)MySQL 角色与SQL CHECK约束
MySQL ROLE MySQL 8.0 Reference Manual / Security / MySQL User Account Management / Using Roles ...
随机推荐
- OpenHarmony标准设备应用开发(二)——布局、动画与音乐
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 邢碌 上一章我们讲解了应用编译环境准备,设备编译环境准备,开发板烧录,将一个最简单的 OpenAtom OpenHar ...
- python爬虫---字体反爬
目标地址:http://glidedsky.com/level/web/crawler-font-puzzle-1 打开google调试工具检查发现网页上和源码之中的数字不一样, 已经确认该题目为 字 ...
- 2021.08.01 P4359 伪光滑数(二叉堆)
2021.08.01 P4359 伪光滑数(二叉堆) [P4359 CQOI2016]伪光滑数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 若一个大于 11 的整数 MM ...
- Java第十五周作业
Cola公司的雇员分为以下若干类:(知识点:多态) [必做题]• 4.1 ColaEmployee :这是所有员工总的父类,属性:员工的姓名,员工的生日月份.方法:getSalary(int mont ...
- Java枚举类与常用方法
小简博客 - 小简的技术栈,专注Java及其他计算机技术.互联网技术教程 (ideaopen.cn) 枚举类 如何创建 首先,从名字就可以看出,枚举是一个类,那么我们就可以直接在创建时选择枚举就可以. ...
- XCTF练习题---MISC---Excaliflag
XCTF练习题---MISC---Excaliflag flag:3DS{Gr4b_Only_th1s_B1ts} 解题步骤: 1.观察题目,下载附件 2.拿到手以后是一张图片,话不多说,直接上Ste ...
- jenkins插件Role-based添加账号后显示红色"No type prefix"
jenkins插件Role-based添加账号save后,前面显示红色"No type prefix",不影响使用. 查了下原因,网上很少正解,我这里记录下正确的方法: 添加用户: ...
- 最佳案例 | 游戏知几 AI 助手的云原生容器化之路
作者 张路,运营开发专家工程师,现负责游戏知几 AI 助手后台架构设计和优化工作. 游戏知几 随着业务不断的拓展,游戏知几AI智能问答机器人业务已经覆盖了自研游戏.二方.海外的多款游戏.游戏知几研发团 ...
- 200 行代码实现基于 Paxos 的 KV 存储
前言 写完[paxos 的直观解释]之后,网友都说疗效甚好,但是也会对这篇教程中一些环节提出疑问(有疑问说明真的看懂了 ),例如怎么把只能确定一个值的 paxos 应用到实际场景中. 既然 Talk ...
- 第06组Alpha冲刺 (4/6)
目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2.曹兰英 3. 方梓涵 4.鲍凌函 5.董翔云 6.杜筱 7.黄少丹 8.曾丽莉 9. 詹鑫冰 10.吴沅静 1.3 冲刺成果展示 1.1 ...