含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
分类:六大约束
NOT NULL:非空,用于保证该字段的值不能为空
非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。
Null类型特征:
- 所有的类型的值都可以是null,包括int、float等数据类型
- 空字符串””不等于null,0也不等于null
create table 表名( 字段名 字段类型 not null,#非空 字段名 字段类型 primary key,#主键 字段名 字段类型 unique,#唯一 字段名 字段类型 default 值,#默认 constraint 约束名 foreign key(字段名) references 主表(被引用列) )
1、非空 添加非空 alter table 表名 modify column 字段名 字段类型 not null; 删除非空 alter table 表名 modify column 字段名 字段类型 ;
创建 not null 约束 CREATE TABLE emp( id INT(10) NOT NULL, NAME VARCHAR(20) NOT NULL DEFAULT ‘abc‘, sex CHAR NULL ); 增加 not null 约束 ALTER TABLE emp MODIFY sex VARCHAR(30) NOT NULL; 取消 not null 约束 ALTER TABLE emp MODIFY sex VARCHAR(30) NULL; 取消 not null 约束,增加默认值 ALTER TABLE emp MODIFY NAME VARCHAR(15) DEFAULT ‘abc‘ NULL;
DEFAULT:默认,用于保证该字段有默认值
添加默认 alter table 表名 modify column 字段名 字段类型 default 值; 删除默认 alter table 表名 modify column 字段名 字段类型 ;
PRIMARY KEY:主键,用于保证该字段的值具有唯一性,非空且唯一
- 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值
- 如果是多列组合的主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
- 每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。
- MySQL的主键名总是PRIMARY,当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
添加主键 alter table 表名 add【 constraint 约束名】 primary key(字段名); 删除主键 alter table 表名 drop primary key;
列级模式 CREATE TABLE emp4( id INT AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(20) ); 表级模式 CREATE TABLE emp5( id INT NOT NULL AUTO_INCREMENT, NAME VARCHAR(20), pwd VARCHAR(15), CONSTRAINT emp5_id_pk PRIMARY KEY(id) ); 组合模式 CREATE TABLE emp6( id INT NOT NULL, NAME VARCHAR(20), pwd VARCHAR(15), CONSTRAINT emp7_pk PRIMARY KEY(NAME,pwd) ); 删除主键约束 ALTER TABLE emp5 DROP PRIMARY KEY; 添加主键约束 ALTER TABLE emp5 ADD PRIMARY KEY(NAME,pwd); 修改主键约束 ALTER TABLE emp5 MODIFY id INT PRIMARY KEY;
UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空
- 唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。
- 唯一约束不允许出现重复的值,但是可以为多个null。
- 同一个表可以有多个唯一约束,多个列组合的约束。
- 在创建唯一约束时,如果不给唯一约束名称,就默认和列名相同。
MySQL会给唯一约束的列上默认创建一个唯一索引;
添加唯一 alter table 表名 add【 constraint 约束名】 unique(字段名); 删除唯一 alter table 表名 drop index 索引名;
create table temp ( id int not null, name varchar(25), password varchar(16), constraint uk_name_pwd unique(name, password) ); 表示用户名和密码组合不能重复 添加唯一约束 alter table temp add unique(name, password); 修改唯一性约束 alter table temp modify name varchar(25) unique; 删除约束 alter table temp drop index name;
CHECK:检查约束【mysql中不支持】
比如检查性别只能是男或者女
MySQL可以使用check约束,但check约束对数据验证没有任何作用,添加数据时,没有任何错误或警告
CREATE TABLE temp( id INT AUTO_INCREMENT, NAME VARCHAR(20), age INT CHECK(age > 20), PRIMARY KEY(id) );
FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值在从表添加外键约束,用于引用主表中某列的值, 相当于unique+not null
- 外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。
- 从表的外键值必须在主表中能找到或者为空。当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据。
- 还有一种就是级联删除子表数据。
- 注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列
- 同一个表可以有多个外键约束
添加外键 alter table 表名 add【 constraint 约束名】 foreign key(字段名) references 主表(被引用列); 删除外键 alter table 表名 drop foreign key 约束名;
创建外键约束 CREATE TABLE dept(//主表 dept_id INT AUTO_INCREMENT PRIMARY KEY, dept_name VARCHAR(20) ); CREATE TABLE emp(//从表 emp_id INT AUTO_INCREMENT PRIMARY KEY, last_name VARCHAR(15), dept_id INT, ); CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id) 创建多列外键组合,必须使用表级约束 CREATE TABLE classes(//主表 id INT, NAME VARCHAR(20), number INT, PRIMARY KEY(NAME,number) ); CREATE TABLE student(//从表 id INT AUTO_INCREMENT PRIMARY KEY, classes_name VARCHAR(20), classes_number INT, FOREIGN KEY(classes_name,classes_number) REFERENCES classes(NAME,number) ); 删除外键约束 ALTER TABLE emp DROP FOREIGN KEY emp_dept_id_fk; 增加外键约束 ALTER TABLE emp ADD [CONSTRAINT emp_dept_id_fk] FOREIGN KEY(dept_id) REFERENCES dept(dept_id);
FOREIGN KEY 约束的关键字
- FOREIGN KEY: 在表级指定子表中的列
- REFERENCES: 标示在父表中的列
- ON DELETE CASCADE( 级联删除): 当父表中的列被删除时,子表中相对应的列也被删除
- ON DELETE SET NULL( 级联置空): 子表中相应的列置空
CREATE TABLE student( id INT AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(20), classes_name VARCHAR(20), classes_number INT, /*表级别联合外键*/ FOREIGN KEY(classes_name, classes_number) REFERENCES classes(NAME, number) ON DELETE CASCADE);
添加约束的时机: 1.创建表时 2.修改表时 约束的添加分类: 列级约束: 六大约束语法上都支持,但外键约束没有效果 表级约束: 除了非空、默认,其他的都支持 主键和唯一的大对比: 保证唯一性 是否允许为空 一个表中可以有多少个 是否允许组合 主键 √ × 至多有1个 √,但不推荐 唯一 √ √ 可以有多个 √,但不推荐 外键: 1、要求在从表设置外键关系 2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求 3、主表的关联列必须是一个key(一般是主键或唯一) 4、插入数据时,先插入主表,再插入从表 删除数据时,先删除从表,再删除主表
CREATE TABLE 表名( 字段名 字段类型 列级约束, 字段名 字段类型, 表级约束 ) CREATE DATABASE students; #一、创建表时添加约束 #1.添加列级约束 /* 语法: 直接在字段名和类型后面追加 约束类型即可。 只支持:默认、非空、主键、唯一 */ USE students; DROP TABLE stuinfo; CREATE TABLE stuinfo( id INT PRIMARY KEY,#主键 stuName VARCHAR(20) NOT NULL UNIQUE,#非空 gender CHAR(1) CHECK(gender=‘男‘ OR gender =‘女‘),#检查 seat INT UNIQUE,#唯一 age INT DEFAULT 18,#默认约束 majorId INT REFERENCES major(id)#外键 ); CREATE TABLE major( id INT PRIMARY KEY, majorName VARCHAR(20) ); #查看stuinfo中的所有索引,包括主键、外键、唯一 SHOW INDEX FROM stuinfo; #2.添加表级约束 /* 语法:在各个字段的最下面 【constraint 约束名】 约束类型(字段名) */ DROP TABLE IF EXISTS stuinfo; CREATE TABLE stuinfo( id INT, stuname VARCHAR(20), gender CHAR(1), seat INT, age INT, majorid INT, CONSTRAINT pk PRIMARY KEY(id),#主键 CONSTRAINT uq UNIQUE(seat),#唯一键 CONSTRAINT ck CHECK(gender =‘男‘ OR gender = ‘女‘),#检查 CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)#外键 ); SHOW INDEX FROM stuinfo; #通用的写法:★ CREATE TABLE IF NOT EXISTS stuinfo( id INT PRIMARY KEY, stuname VARCHAR(20), sex CHAR(1), age INT DEFAULT 18, seat INT UNIQUE, majorid INT, CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) ); #二、修改表时添加约束 /* 1、添加列级约束 alter table 表名 modify column 字段名 字段类型 新约束; 2、添加表级约束 alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】; */ DROP TABLE IF EXISTS stuinfo; CREATE TABLE stuinfo( id INT, stuname VARCHAR(20), gender CHAR(1), seat INT, age INT, majorid INT ) DESC stuinfo; #1.添加非空约束 ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL; #2.添加默认约束 ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18; #3.添加主键 #①列级约束 ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY; #②表级约束 ALTER TABLE stuinfo ADD PRIMARY KEY(id); #4.添加唯一 #①列级约束 ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE; #②表级约束 ALTER TABLE stuinfo ADD UNIQUE(seat); #5.添加外键 ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id); #三、修改表时删除约束 #1.删除非空约束 ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL; #2.删除默认约束 ALTER TABLE stuinfo MODIFY COLUMN age INT ; #3.删除主键 ALTER TABLE stuinfo DROP PRIMARY KEY; #4.删除唯一 ALTER TABLE stuinfo DROP INDEX seat; #5.删除外键 ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major; SHOW INDEX FROM stuinfo;
自增长列
特点:
1、不用手动插入值,可以自动提供序列值,默认从1开始,步长为1
auto_increment_increment
如果要更改起始值:手动插入值
如果要更改步长:更改系统变量
set auto_increment_increment=值;
2、一个表至多有一个自增长列
3、自增长列只能支持数值型
4、自增长列必须为一个key
一、创建表时设置自增长列 create table 表( 字段名 字段类型 约束 auto_increment ) 二、修改表时设置自增长列 alter table 表 modify column 字段名 字段类型 约束 auto_increment 三、删除自增长列 alter table 表 modify column 字段名 字段类型 约束