为了数据的完整性
按列分:
按约束 的作用范围:
sqlNOT NULL#非空约束,指定某个字段不能为空
UNIQUE #唯一约束,,让某字段在整个表中是唯一的
PRIMARY KEY #主键约束
FOREIGN KEY #外键约束
CHECK #检查约束 8.0才支持的,5.7还不支持
DEFAULT #默认值约束
建表的时候给它约束,加在类型的后面
sqlCREATE TABLE student1(
sno VARCHAR(10) ,
sname VARCHAR(10) NOT NULL,
age INT NOT NULL
);
当然,对于一个已经建好的表,我们也可以对它进行修改
sqlALTER TABLE student1
MODIFY sno VARCHAR(10) NOT NULL;
删除非空约束,像上面那样
sqlALTER TABLE student1
MODIFY sno VARCHAR(10) NULL;
注意一点: 如果原来的字段是空,那么你就不能把该字段修改成可以为空,当然你修改也会报错
作用在字段上,使该字段不能有重复的值出现
创建表的时候进行添加约束:
sqlCREATE TABLE student2(
sno VARCHAR(10) UNIQUE,#列级约束,写unique key 也是可以的
sname VARCHAR(10) ,
age INT,
CONSTRAINT sname_uni UNIQUE KEY(sname)#表级约束
);
#查看表中的约束
SELECT * FROM information_schema.`TABLE_CONSTRAINTS`
WHERE table_name = 'student2'
当没有指定的名字的时候,就是列的名字。
测试它的唯一性:
sql#先插入1条记录
INSERT INTO student2(sno,sname,age)
VALUE('111','haha',12)
#测试插入另一个记录
INSERT INTO student2(sno,sname,age)
VALUE('111','aaaaa',11)
唯一约束的列可以为空,可以多次插入——其实很好理解,空就是没有嘛,没有和唯一有什么关系嘛。
sqlINSERT INTO student2(sno,sname,age)
VALUE(NULL,'cd',23),
(NULL,'fe',43);
在创建完成表之后添加唯一性约束
用ALTER
先创建一个表
sqlCREATE TABLE student3(
sno VARCHAR(10),
sname VARCHAR(10) ,
age INT
);
方式1用ADD
添加
sqlALTER TABLE student3
ADD CONSTRAINT sno_uni UNIQUE(sno);
方式2用MODIFY
进行修改
sqlALTER TABLE student3
MODIFY sname VARCHAR(10) UNIQUE;
复合唯一约束
所谓的复合唯一约束就是把多个段合在一起进行约束
sqlCREATE TABLE student4(
sno VARCHAR(10),
sname VARCHAR(10),
sex VARCHAR(5),
CONSTRAINT sname_sex_uni UNIQUE(sname,sex)
)
只要sname
和sex
这两个字段不全相等就可以。
sqlINSERT INTO student4
VALUE('123332','ml','男'),
('123','hh','女');
#在插入一条数据
INSERT INTO student4
VALUE('3543254','ml','女')# 该条语句可以插入
#插入一个组合约束,则就会报错,不允许进行插入
INSERT INTO student4
VALUE('1111111','ml','男')
删除唯一性约束只能通过删除唯一索引的方式删除 删除唯一索引就要知道它的名字,唯一索引的名字就是唯一约束的名字
查看约束
sqlSELECT * FROM information_schema.`TABLE_CONSTRAINTS`
WHERE table_name='表名'
删除的方法:
sqlALTER TABLE student4
DROP INDEX 索引名
主键约束相当于唯一约束+非空约束。主键约束的列不允许重复,也不允许出现空值 一个表最多有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别创建 主键约束对应表中的一列或者多列(复合主键) MySQL的主键名总是
PRIMARY
,自己命名了也没有用 创建主键约束时,系统默认建立对应的主键索引。如果删除主键约束、对应的索引就自动删除了。
建表时指定主键约束
列级约束——在字段后面进行添加
sqlCREATE TABLE student5(
sno VARCHAR(10) PRIMARY KEY,
sname VARCHAR(10),
sex VARCHAR(5),
age INT
);
表级约束——所有字段的后面
sqlCREATE TABLE student6(
sno VARCHAR(10),
sname VARCHAR(10),
sex VARCHAR(5),
age INT,
PRIMARY KEY(sno)//没有必要起名字,因为起了名字,还是叫primary
);
建表之后添加主键
sqlALTER TABLE 表名 ADD PRIMARY KEY(字段)
复合主键和复合唯一约束一样,()
里面放入多个字段,每个字段用,
隔开
删除主键约束 在实际的开发中,并不会删除主键 下面是删除主键
sqlALTER TABLE 表名 DROP PRIMARY KEY #因为主键是唯一的,不需要指明主键名
关键字:AUTO_INCREMENT
一个表中最多有一个自增列 当需要产生唯一标识符或者顺序值时,可以设置自增列 自增列所在的列必须是键列(主键列primary key、唯一键列 unique key) 自增列的数据类型必须是整型类型 当添加数据的时候,如果指定了此列是0,或者null,那么添加成功的时候,会从当前最大值的基础上自增
添加自增列 建表时添加
sqlCREATE TABLE emp1(
id INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(10)
)
建表完成之后添加
sqlALTER TABLE 表名 MODIFY 字段名 数据类型 AUTO_INCREMENT
#如
ALTER TABLE emp2 MODIFY id INT PRIMARY KEY AUTO_INCREMENT
删除自增列
sqlALTER TABLE 表名 MODIFY 字段名 类型 #相当于重置了一下
MySQL8.0中,自增变量具有持久化——删除之后,计数器没有变 比如:当前是5,删除5这条记录的之后,重启服务器,再次添加数据,就是6,而不是5。
外键约束
外键约束会涉及到主表和从表 主表(父表):被引用的表 从表(子表):引用别人的表
从表的外键必须引用主表的主键或者唯一性约束的列 在创建外键的时候,如果不给外键约束的话,默认名不是列名,而是自动产生一个外键名,当然也可以指定外键约束名
创建表的顺序,先创建主表,再创建从表 删表,先删从表,再上主表 从表的外键列和主表的列名字可以不相同,但是数据类型必须一样。
当创建外键约束时,系统默认会在所在的列上创建对应的普通索引,索引名就是外键的约束名。删除外键约束后,必须手动删除对应的索引
语法: 看下面的例子
例子:
sql#主表
CREATE TABLE student(
last_name VARCHAR(10),
stusno VARCHAR(10) PRIMARY KEY,
age INT
)
#从表
CREATE TABLE task(
tesno VARCHAR(10),
age INT ,
CONSTRAINT fk_sno FOREIGN KEY(tesno) REFERENCES student(stusno)
)
当然建表之后也是可以进行更改的。
其实这东西让我感觉好麻烦,看着都头疼。
因为创建好之后,我们会发现插入数据也比较麻烦,删除也麻烦,动不动就各种问题
所以,对于外键约束,最好采用ON UPDATE CASCADE ON DELETE RESTRICT
的方式
也可以用下面的约束等级,等用到了再说。
在阿里开发规范中:不得使用外键约束与级联,一切外键概念必须在应用层解决
检查模字段的值是否复合要求 MySQL5.7可以支持该约束,但是不起作用。但是在MySQL8.0中就可以使用check约束了
指定某个字段默认值,意思就是当该字段没有插入数据的时候,使用默认值
就是在后面加上default
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有