MySQL-第三篇SQL语句基础(2)数据库约束
1、数据库约束。
约束是在表上强制执行的数据校验规则,约束主要用于保证数据库里数据的完整性。
MySQL使用information_schema数据库里的TABLE_CONSTRAINTS表来保存该数据库实例中的所有约束信息。
2、常见的数据库完整性约束:
1》NOT NULL:非空约束。
2》UNIQUE:唯一约束,指定某些列(一个或者多个)或者几列的组合不能重复。
3》PRIMARY KEY:主键约束,指定某列的值可以唯一地标识该条记录。
4》FOREIGN KEY:外键约束,指定该行记录从属于主表中的某一条记录(如某字段的字段值必须是主表某字段存在的值),主要用于保证参照完整性。
5》CHECK:检查,指定一个布尔表达式,用于指定对应列的值必须满足该表达式。(MySQL不支持这种约束,即使MySQL语句中可以使用CHECK约束,但约束并不会起效)
3、约束也是数据库对象,被存储在数据字典(系统表)中。根据约束对数据列的限制,约束分为以下两类:
1》单列约束:每个约束只约束一列。
2》多列约束:每个约束可以约束多个数据列。
4、指定约束的两个时机:
1》建表的同时为相应的数据列指定约束。
2》建表后创建,以修改表的方式来增加约束。
大部分约束都可以采用列级约束语法或者表级约束语法。
5、常见的5种约束详解
1》not null约束
只能作为列级约束使用,只能使用列级约束语法定义。
SQL中的null不区分大小写,所有数据类型都可以是null,空字符串不等于null,0不等于null,null也不等于null。
2》unique约束
指定某些列(一个或者多个)或者几列的组合不能重复(但可以出现多个null值,因为null也不等于null)。
当为某列创建唯一约束时,MySQL会为该列相应地创建唯一索引。如果不给唯一约束起名,该唯一约束默认与列名相同。
唯一约束既可以使用列级约束语法建立,也可以使用表级约束语法建立。如果需要为多列建组合唯一约束,或者需要为唯一约束指定约束名,则只能用表级约束语法。
表级约束语法格式:该约束语法格式既可以放在create table语句中与列定义并列,也可以放在alter table语句中使用add关键字来添加约束。
[constraint 约束名] 约束定义
例子:
--单列唯一约束
create table emp
(
--使用列级约束
e_id varchar() unique,
e_name varchar(255),
e_pass varchar(255),
--使用表级约束语法建立唯一约束
unique (e_name),
--使用表级约束语法建立唯一约束,而且指定约束名
constraint un_emp_pass unique(e_pass)
);
create table emp
(
--使用列级约束
e_id varchar(255) unique,
e_name varchar(255),
e_pass varchar(255),
--使用表级约束语法建立唯一约束,指定两列组合不允许重复,而且指定约束名
constraint un_emp_name_pass unique(e_name,e_pass)
);
修改表结构的时候使用add关键字来增加唯一约束:
alter table emp add unique(e_name,e_pass);
还可以在修改表时使用modify关键字,为单列采用列级语法来增加唯一约束:
alter table emp modify e_name varchar(255) unique;
删除索引:删除unique约束,对于大部分数据库而言都是在alter table语句后使用“drop constraint 约束名”,但MySQL并不使用这种方式,而是使用“drop index 约束名”的方式来删除约束。
alter table emp drop index un_emp_name_pass;
3》primary key约束
主键约束,相当于非空约束和唯一约束的与。如果多列里包含的每一列都不能为空,但只要求这些列组合不能重复。
每个表中最多允许有一个主键。建立主键约束时既可以使用列级约束语法,也可以使用表级约束语法。
如果需要对多个字段建立组合主键约束,则只能使用表级约束语法。使用表级约束语法来建立约束时,可以为该约束指定约束名。但不管用户是否为该主键约束指定约束名,MySQL总是将所有的主键约束名为primary。(MySQL允许在建立主键约束时为该约束命名,但这个名字没有任何作用,主要是为了保持与标准SQL的兼容性)
例子:
create table emp
(
--使用列级主键约束
e_id varchar(255) primary key,
e_name varchar(255),
e_pass varchar(255),
);
create table emp
(
e_id varchar(255),
e_name varchar(255),
e_pass varchar(255),
--使用表级主键约束。指定了主键约束名为pk_emp_id,但对MySQL无效。
--MySQL数据库中该主键约束名依然是primary
constraint pk_emp_id primary key(e_id)
);
create table emp
(
e_id varchar(255),
e_name varchar(255),
e_pass varchar(255),
--使用表级主键约束创建多字段主键
primary key(e_id,e_name)
);
删除某表的主键约束:
alter table 表名 drop primary key;
为某表增加主键约束,可以通过modify关键字修改列定义来增加主键约束,这将采用列级语法来增加主键约束;也可以通过add来增加主键约束,这将采用表级约束语法来增加主键约束。
alter table emp modify e_id varchar(255) primary key;
alter table emp add primary key(e_id,e_name);
如果主键列(单字段的)是整型,则可指定该列具有自增长功能。指定自增长功能通常用于设置逻辑主键列,即该列的值没有具体物理意义,仅仅用于标识每行记录。MySQL使用auto_increment来设置自增长。
create table emp
(
--使用列级主键约束。并且是自增长的。
e_id int auto_increment primary key,
e_name varchar(255),
e_pass varchar(255),
);
4》foreign key约束
外键约束主要用于保证一个或者两个数据表之间的参照完整性,外键是构建于一个表的两个字段之间(表内字段参照)或者两个表的两个字段之间(表间字段参照)的参照关系。
外键确保了相关的两个字段的参照关系:子(从)表外键列的值必须在主键被参照列的值范围之内,或者为空。
当主表的记录被从表记录参照时,主表记录不允许被删除,必须先把从表里参照该记录的所有记录全部删除后,才可以删除主表的该记录。还有一种方式,删除主表记录时级联删除从表中所有参照该记录的从表记录。
从表外键参照的只能是主表主键列或者唯一键列,这样才可以保证从表记录可以准确定位到被参照的主表记录。同一个表内可以拥有多个外键。
建立外键约束时,MySQL也会为该列建立索引。
外键约束通常用于定义两个实体之间的一对一、一对多的关联关系。对于一对多的关联关系,通常在多的一端增加外键列。对于多对多的关联关系,则需要额外增加一个连接表来记录它们的关联关系。
建立外键约束同样可以使用列级约束语法和表级约束语法。如果仅对单独的数据列建立外键约束,则使用列级约束语法即可;如果需要对多列组合创建外键约束或者需要为外键约束指定名字,则必须使用表级约束语法。
采用列级约束语法创建外键约束直接使用references关键字,references指定该列参照哪个主表,以及参照主表的哪一列。但这种列级约束创建外键的方式并不会使外键生效。
create table teacher
(
--使用列级主键约束
t_id int auto_increment primary key,
t_name varchar(255),
t_pass varchar(255),
); create table student
(
s_id int auto_increment primary key,
s_name varchar(255),
s_pass varchar(255),
--使用列级约束创建外键
teacher_id int references teacher(t_id)
);
如果要想使MySQL中的外键约束生效,则应使用表级约束语法。使用表级约束创建外键,需要使用foreign key来指定本表的外键列,并使用references来指定参照哪个主表,以及参照到主表的哪个数据列。
create table teacher
(
--使用列级主键约束
t_id int auto_increment primary key,
t_name varchar(255),
t_pass varchar(255),
); create table student
(
s_id int auto_increment primary key,
s_name varchar(255),
s_pass varchar(255),
--使用表级约束创建外键
teacher_id int,
foreign key(teacher_id) references teacher(t_id)
);
使用表级约束语法可以为外键约束指定约束名,如果创建外键约束时没有指定约束名,则MySQL会为该外键约束命名为table_name_ibfk_n,如上面的创建方式。其中table_name是从表的表名,而n是从1开始的整数。如果需要显式指定外键约束的名字,则使用constraint来指定名字。
create table teacher
(
--使用列级主键约束
t_id int auto_increment primary key,
t_name varchar(255),
t_pass varchar(255),
); create table student
(
s_id int auto_increment primary key,
s_name varchar(255),
s_pass varchar(255),
--使用表级约束创建外键,并创建一个可生效的外键名
teacher_id int,
constraint stu_tea_fk_id foreign key(teacher_id) references teacher(t_id)
);
如果创建多列组合的外键约束,则必须使用表级约束语法。
create table teacher
(
e_id int auto_increment,
e_name varchar(255),
e_pass varchar(255),
--使用表级主键约束创建多字段主键
primary key(e_name,e_pass)
); create table student
(
s_id int auto_increment primary key,
s_name varchar(255),
s_pass varchar(255),
--使用表级约束创建外键,并创建一个可生效的外键名
teacher_name varchar(255),
teacher_pass varchar(255),
constraint stu_tea_fk_name_pass foreign key(teacher_name,teacher_pass) references teacher(t_name,t_pass)
);
删除外键约束。语法非常简单,在alter table后增加“drop foreign key 约束名”即可。
alter table student drop foreign key student_ibfk_1;
增加外键约束。通常使用add foreign key命令。
alter table student add foreign key(teacher_name,teacher_pass) references teacher(t_name,t_pass);
外键约束不仅可以参照其他表(表间参照),还可以参照自身(表内参照),这种参照自身的关联被称作自关联。
create table person
(
p_id int auto_increment primary key,
p_name varchar(255),
p_fk_id int,
constraint person_fk_id foreign key(p_fk_id) references person(p_id)
);
如果想定义外键在发生主表被参考记录删除时,从表记录也会随之删除,则需要在建立外键约束后添加“on delete cascade”或者“on delete set null”,第一种是删除主表记录时,把参照该主表记录的从表记录全部级联删除;第二种是指定当删除主表记录时,把参照该主表记录的从表记录的外键设为null。
create table teacher
(
--使用列级主键约束
t_id int auto_increment primary key,
t_name varchar(255),
t_pass varchar(255),
); create table student
(
s_id int auto_increment primary key,
s_name varchar(255),
s_pass varchar(255),
--使用表级约束创建外键,并创建一个可生效的外键名
teacher_id int,
constraint stu_tea_fk_id foreign key(teacher_id) references teacher(t_id)
on delete cascade --或者on delete set null
);
5》check约束
MySQL支持在建表时指定check约束,但这个约束不会起任何作用。
语法:
create table emp
(
e_id int primary key,
e_name varchar(255),
e_pass varchar(255),
--建立check约束
check(e_id>0)
);
MySQL-第三篇SQL语句基础(2)数据库约束的更多相关文章
- MySQL-第二篇SQL语句基础(1)语句分类及DDL语句
1.什么是SQL语句 SQL是Structed Query Language的缩写,即结构化查询语言.SQL是操作和检索数据库的标准语言,标准的SQL语句可以操作任何关系数据库. 2.标准的SQL语句 ...
- 详解MySQL第三篇—DCL语句
DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句.这些语句定义了数据库.表.字段.用户的访问权限和安全级别.主要的语句关键字包括 g ...
- mysql第四篇--SQL逻辑查询语句执行顺序
mysql第四篇--SQL逻辑查询语句执行顺序 一.SQL语句定义顺序 SELECT DISTINCT <select_list> FROM <left_table> < ...
- 2019.3.22 SQL语句(基础篇)
SQL语句 创建一个数据库: create database+数据库名; 使用数据库: use+数据库名; 查看mySQL中有哪些数据库: show databases; 删除数据库 drop dat ...
- 浅谈mysql配置优化和sql语句优化【转】
做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...
- SQL语句基础之 管理数据库,表 和 数据
MySQL中的基本sql语句 MySQL中主要有三个大的对象,第一个是数据库,有了数据库后,我们才能在数据库里面建表,因为Mysql是关系数据库,它的数据都会以记录的形式存到表里,所以第二个是表,然后 ...
- 精妙SQL语句 基础
精妙SQL语句SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作,方便自己写SQL时方便一点,想贴上来,一起看看,同时希望大家能共同多多提意见,也给我留一些更好的佳句, ...
- 如何用VS EF连接 Mysql,以及执行SQL语句 和存储过程?
VS2013, MySQL5.7.18 , MySQL5.7.14 执行SQL语句: ztp_user z = new ztp_user(); object[] obj = new object[] ...
- mysql里面如何用sql语句让字符串转换为数字
sql语句将字符串转换为数字默认去掉单引号中的空格,遇到空格作为字符串截止, SELECT '123 and 1=1' +0 结果为123 MySQL里面如何用sql语句让字符串的‘123’转换为数字 ...
随机推荐
- ssh: Could not resolve hostname github.com: Name or service not known
问题描述 今天早上在自己的虚拟机上用git pull命令更新github上的版本库时提示下面的错误 [root@localhost ~] git clone git@github.com:sdscbr ...
- jQuery学习总结05-事件
1.事件的发生 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- Taro -- 微信小程序密码弹窗
记录一个类似支付密码的弹窗写法,实现是否免密功能.如图: index.js import Taro, { Component } from '@tarojs/taro' import { Vi ...
- int型、char*、string、的swap算法
1.俩整数,不使用中间变量交换其值: int& intswap(int& a, int& b) { b ^= a; a ^= b; b ^= a; return b; } 2. ...
- php 输出缓冲
<?php ob_start();//开启php输出缓冲区 echo "A"; //"A"会进入php输出缓冲区 ob_flush();//将php输出缓 ...
- 编译原理--NFA/DFA
现成的, 讲义: https://www.cnblogs.com/AndyEvans/p/10240790.html https://www.cnblogs.com/AndyEvans/p/10241 ...
- Java+Maven的工程运行Sonar的方式
step 1:在maven->setting.xml中进行配置 修改mvn工程所用的setting.xml文件,在<profiles></profiles>节点中增加: ...
- VR和AR
VR 虚拟现实,比如你天气很炎热,戴上VR眼镜,出现在你眼前的是哈尔滨的冰雪世界 AR 增强现实,比如你站在一片碧绿的草地上,给你身边来一匹快马 想想一个单身狗去电影院,给你身边来一个美女作陪,这是多 ...
- AOP说明
小程序的开发者或者服务商会提供一些lib库,用来代理小程序的生命周期或API等,进而想要进行一些通用逻辑的处理(例如: 打点/事件触发/统一登录等等通用逻辑). 通常,小程序开发者们使用这些扩展包时, ...
- CentOS-7.4(1708)release notes发行注记
Red Hat Enterprise Linux 当前的最新版本是 7.3. Red Hat Enterprise Linux 7 当前仅支持 64 位CPU:64-bit AMD.64-bit In ...