约束用于确保数据库中的数据满足特定的商业规则。
MySQL约束包含五种:not null、unique、primary key、foreign key、check
7.1 primary key 主键
字段名 字段类型 primary key
用于唯一的标识表的行数据,当定义主键约束后,该列不能重复。
-
primary key不能重复而且不能为null
-
一张表最多只能有一个主键,但可以是复合主键(同时重复,才违反主键不可重复的原则)
-
主键的指定方式有两种:直接在字段后指定:字段名 字段类型 primakry key
在表定义最后写 primary key(列名);
-
使用desc表名,可以看到primary key的情况
-
在实际开发中,每个表往往都会设计一个主键
CREATE TABLE tab
(id INT PRIMARY KEY, -- 表示 id 列是主键
`name` VARCHAR(32));
CREATE TABLE tab
(id INT,
`name` VARCHAR(32),
PRIMARY KEY(id)
);
# 复合主键 (id 和 name 做成复合主键)
# 当id和name同时重复,才违反主键不可重复的原则
CREATE TABLE tab(
id INT ,
`name` VARCHAR(32),
email VARCHAR(32),
PRIMARY KEY (id, `name`) -- 这里就是复合主键
);
7.2 not null 非空
字段名 字段类型 not null
如果列上指定了not null,插入数据时必须为列提供数据
7.3 unique 唯一
字段名 字段类型 unique
如果列上指定了unique,该列数据不能重复
-
如果没有指定 not null,则 unique 字段可以有多个null
-
与主键的区别是:一张表可以有多个unique字段
-
unique not null 使用效果类似 primary key
7.3 foreign key 外键
FOREIGN KEY (本表字段名) REFERENCES 主表名(主键名或unique字段名)
用于定义主表和从表之间的关系: 外键约束要定义在从表上,主表则必须具有主键约束或是unique约束。当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null。
由于主表中没有id=300,从表class_id=300插入失败
如果要删除主表id=200的记录,会删除失败,因为有从表与它有外键约束,必须先删除从表class_id=200的记录,才能删除主表id=200的记录。
-
外键指向的表的字段,要求是primary key 或者是unique
-
表的类型是innodb,这样的表才支持外键
-
外键字段的类型要和主键字段的类型一致(长度可以不同)
-
外键字段的值,必须在主键字段中出现过,或者为nul[前提是外键字段允许为null]
-
一旦建立主外键的关系,数据不能随意删除了
-- 创建 主表 my_class
CREATE TABLE my_class (
id INT PRIMARY KEY , -- 班级编号
`name` VARCHAR(32) NOT NULL DEFAULT ''
);
-- 创建 从表 my_stu
CREATE TABLE my_stu (
id INT PRIMARY KEY , -- 学生编号
`name` VARCHAR(32) NOT NULL DEFAULT '',
class_id INT , -- 学生所在班级的编号
-- 下面指定外键关系
FOREIGN KEY (class_id) REFERENCES my_class(id)
);
7.4 check
列名 类型 check(check条件)
用于强制行数据必须满足的条件。
假定在sal列上定义了check约束,要求sal列值在1000~2000之间,如果不再1000~2000之间就会提示出错。
在mysql中实现check的功能,一般是在程序中控制或者通过触发器完成。
CREATE TABLE tab (
id INT PRIMARY KEY,
`name` VARCHAR(32) ,
sex VARCHAR(6) CHECK (sex IN('man','woman')),
sal DOUBLE CHECK ( sal > 1000 AND sal < 2000)
);
自增长:auto_increment
字段名 整型 primary key auto_increment
希望id列在添加记录的时候该列从1开始,自动的增长
插入数据是可以给null,或直接跳过该字段赋值
INSERT INTO tab VALUES(NULL, 'tom@qq.com', 'tom');
INSERT INTO tab (email, `name`) VALUES('hsp@sohu.com', 'hsp');
-
一般来说自增长是和primary key 配合使用的
-
自增长也可以单独使用[但是需要配合一个unique]
-
自增长修饰的字段为整数型(虽然小数也可以但是非常少这样使用)
-
自增长默认从1开始,也可以修改:alter table 表名 auto increment = 新的开始值;
-
如果你添加数据时,给自增长字段(列)指定的有值,则以指定的值为准,如果指定了自增长,一般来说,就按照自增长的规则来添加数据.