Mysql基础02-约束
1、数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。
-
-
域完整性(Domain Integrity):例如:年龄范围0-120,性别范围“男/女”
-
引用完整性(Referential Integrity):例如:员工所在部门,在部门表中要能找到这个部门
-
用户自定义完整性(User-defined Integrity):例如:用户名唯一、密码不能为空等
2、约束
-
-
Not NULL约束:非空约束
-
Check约束:检查约束
-
Default约束:默认值约束
-
自增约束
3、约束(CONSTRAINTS)与索引(INDEX)
约束是用来对数据业务规则和数据完整性进行实施、维护。约束的作用范围仅限在当前数据库,是逻辑约束,不会因为设置约束而额外占用空间。
可以大大提高查询速度。应该在键列、或其他经常要查询、排序、按范围查找的列上建立索引。
其中主键删除,对应的索引也会删除
删除唯一键的方式是通过删除对应的索引来实现的
删除外键,外键列上的索引还在,如果需要删除,需要单独删除索引
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称'; 或 SHOW CREATE TABLE 表名;
SHOW INDEX FROM 表名称;
主键分为单列主键和复合主键
主键的特点:
(1)唯一并且非空(2)一个表只能有一个主键约束(3)主键约束名就叫做PRIMARY(4)创建主键会自动创建对应的索引,同样删除主键对应的索引也会删除。
建表时指定主键约束
create table 【数据名.】表名( 字段名1 数据类型 primary key , .... ); 或 create table 【数据名.】表名( 字段名1 数据类型, ...., primary key(字段名1) ); 或 create table 【数据名.】表名( 字段名1 数据类型, 字段名2 数据类型, ...., primary key(复合主键字段列表) #如果是复合主键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加primary key );
建表后指定主键约束
alter table 表名称 add primary key (主键字段列表);
删除主键约束
alter table 表名称 drop primary key;
唯一键约束特点:
建表时指定唯一键约束
create table 【数据名.】表名( 字段名1 数据类型 primary key , 字段名2 数据类型 unique key, .... ); create table 【数据名.】表名( 字段名1 数据类型 primary key , 字段名2 数据类型, 字段名3 数据类型, ...., unique key(复合唯一字段列表) #如果是复合唯一键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加unique key );
建表后增加唯一键约束
alter table 表名称 add 【constraint 约束名】 unique 【key】 (字段名列表);
#如果没有指定约束名,(字段名列表)中只有一个字段的,默认是该字段名,如果是多个字段的默认是字段名列表的第1个字段名。
删除唯一键约束
ALTER TABLE 表名称 DROP INDEX 唯一键约束名;
外键特点:
-
-
在创建外键约束时,如果不给外键约束名称,默认名不是列名,而是自动产生一个外键名(例如 student_ibfk_1;),也可以指定外键约束名。
-
当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。但是索引名是列名,不是外键的约束名。
-
删除外键时,关于外键列上的普通索引需要单独删除。
-
在从表上建立外键,而且主表要先存在。
-
一个表可以建立多个外键约束
-
从表的外键列,在主表中引用的只能是键列(主键,唯一键,外键),推荐引用主表的主键。
-
从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样
约束关系:约束是针对双方的
添加了外键约束后,从表的添加和修改受约束
5个约束等级
-
-
Set null方式:在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要注意子表的外键列不能为not null
-
No action方式:如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
-
Restrict方式:同no action, 都是立即检查外键约束
-
Set default方式(在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别
如果没有指定等级,就相当于Restrict方式
建表时指定外键约束
create table 【数据名.】从表名( 字段名1 数据类型 primary key , 字段名2 数据类型 【unique key】, ...., 【constraint 外键约束名】 foreign key (从表字段) references 主表名(主表字段) 【on update 外键约束等级】【on delete 外键约束等级】 );
#外键只能在所有字段列表后面单独指定
#如果要自己命名外键约束名,建议 主表名_从表名_关联字段名_fk
建表后指定外键约束
alter table 从表名称 add 【constraint 外键约束名】 foreign key (从表字段名) references 主表名(主表被参照字段名) 【on update xx】【on delete xx】;
删除外键约束
ALTER TABLE 表名称 DROP FOREIGN KEY 外键约束名;
#删除外键约束不会删除对应的索引
删除索引
ALTER TABLE 表名称 DROP INDEX 索引名;
规定某个字段不能为空
建表时指定非空约束
create table 【数据名.】表名( 字段名1 数据类型 primary key , 字段名2 数据类型 【unique key】 【not null】, 字段名2 数据类型 【not null】, ...., );
建表后指定非空约束
ALTER TABLE 表名称 MODIFY 字段名 数据类型 NOT NULL 【default 默认值】;
#如果该字段原来设置了默认值约束,要跟着一起再写一遍,否则默认值约束会丢失
删除非空约束
ALTER TABLE 表名称 MODIFY 字段名 数据类型 【default 默认值】;
#如果该字段原来设置了默认值约束,要跟着一起再写一遍,否则默认值约束会丢失
建表时指定默认约束
create table 【数据名.】表名( 字段名1 数据类型 primary key , 字段名2 数据类型 【unique key】 【not null】 【default 默认值】, 字段名3 数据类型 【not null】 【default 默认值】, ...., );
建表后指定默认值约束
ALTER TABLE 表名称 MODIFY 字段名 数据类型 【default 默认值】 【NOT NULL】;
#如果该字段原来设置了非空约束,要跟着一起再写一遍,否则非空约束会丢失
删除默认值约束
ALTER TABLE 表名称 MODIFY 字段名 数据类型 【NOT NULL】;
#如果该字段原来设置了非空约束,要跟着一起再写一遍,否则非空约束会丢失
检查约束,mysql暂不支持
特点:
-
-
自增长列必须是键列(主键列,唯一键列,外键列),并且要求非空。
-
自增列必须是整数类型
-
InnoDB表的自动增长列可以手动插入,但是插入的值如果是空或者0,则实际插入的将是自动增长后的值。
建表时指定自增长
create table 【数据名.】表名( 字段名1 数据类型 primary key auto_increment, 字段名2 数据类型 【unique key】 【not null】 【default 默认值】, .... ); 或 create table 【数据名.】表名( 字段名1 数据类型 primary key , 字段名2 数据类型 【unique key not null】 auto_increment, .... );
建表后指定自增长
alter table 【数据名.】表名 modify 自增字段名 数据类型 auto_increment;
删除自增约束
alter table 【数据名.】表名 modify 自增字段名 数据类型;
添加数据时,如果某列有自增约束,怎么添加该字段的值
insert into 【数据库名.]表名称 values(值列表);#在值列表中,对应自增列可以赋值为null和0
insert into 【数据库名.]表名称(部分字段列表) values(值列表);#自增列在(部分字段列表)中不写就可以
添加数据时,如果某列有默认值约束,怎么添加、修改该字段的值
insert into 【数据库名.]表名称 values(值列表);#在值列表中,对应默认值列,如果想用默认值,用default insert into 【数据库名.]表名称(部分字段列表) values(值列表);#对应默认值列,如果想用默认值,在(部分字段列表)中不写就可以
修改数据
update 【数据库名.]表名称 set 字段名1 = 值1, 字段名2 = 值2 。。。 【where 条件】; #对应默认值列,如果想用默认值,写字段名 = default就可以
原文地址:https://www.cnblogs.com/Open-ing/p/12020024.html
- 论JavaScript的作用域
- 删除链表中的重复元素
- Single Number and Single Number II
- 前端限制上传文件的类型
- JavaSript模块规范 - AMD规范与CMD规范介绍
- [大数据之Sqoop] —— Sqoop初探
- [大数据之Sqoop] —— 什么是Sqoop?
- Node.js包管理器Yarn的入门介绍与安装
- static_cast ,reinterpret_cast
- NodeJS使用formidable实现文件上传
- 签下北方最大港口,聚焦无人驾驶卡车技术的主线科技朝商业化又进一步
- 对缓存的思考——提高命中率
- 实用手册:130+ 提高开发效率的 vim 常用命令
- Sqoop切分数据的思想概况
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 软件包管理、计划任务-Linux每日一练(8)
- AkShare-能源数据-碳排放-湖北
- AkShare-能源数据-碳排放-广州
- AkShare-股票数据-次新股
- 问与答87: 如何根据列表内容在文件夹中查找图片并复制到另一个文件夹中?
- Java反射是什么?看这篇绝对会了!
- Vuejs 3.0 正式版发布!One Piece. 代号:海贼王
- ES6中模块导入遇到的问题及其解决办法
- 还在手写任务调度代码?试试这款可视化分布式调度框架!
- 3分钟搞定微信小程序类美团用户商家距离计算
- pytest封神之路第五步 参数化进阶
- 深入解读Vue修饰符sync
- 【深度知识】以太坊数据序列化RLP编码/解码原理
- Android 带伸缩动画的布局
- iOS 图像处理技术追踪-Core Image