约束用于确保数据库的数据满足特定的商业规则。在 mysql 中,约束包括:not null、unique、primary key、foreign key 和 check 五种
字段名 字段类型 PRIMARY KEY
用于唯一的标识表行的数据,当定义主键约束后,该类不能重复
细节说明:
1、primary key不能重复而且不能为null
2、一张表最多只能有一个主键,但可以是复合主键
3、主键的指定方式有两种
1. 直接在字段后面指定:字段名 primary key
2. 在表定义最后写 primary key(列名)
4、使用desc 表名,可以看到primary key的情况
(在实际开发中,每个表往往都会设计一个主键)
-- 主键的使用-- id name email
CREATE TABLE t14(id INT PRIMARY KEY, -- 表示id列是主键`name` VARCHAR(32),email VARCHAR(32)
);-- 主键列的值是不可以重复的
INSERT INTO t14 VALUES(1, 'jack', 'jack@qq.com');
INSERT INTO t14 VALUES(2, 'tom', 'tom@qq.com');
INSERT INTO t14 VALUES(1, 'smith', 'smith@qq.com');-- 主键使用的细节讨论
-- primary key不能重复而且不能为null
INSERT INTO t14 VALUES(NULL, 'smith', 'smith@qq.com');-- 一张表最多只能有一个主键,但可以是复合主键(比如id + name)
CREATE TABLE t15(id INT PRIMARY KEY, -- 表示id列是主键`name` VARCHAR(32) PRIMARY KEY, -- 错误的email VARCHAR(32)
);-- 演示复合主键(id 和 name 做成复合主键)
CREATE TABLE t15(id INT,`name` VARCHAR(32),email VARCHAR(32),PRIMARY KEY(id, `name`) -- 复合主键
);INSERT INTO t15 VALUES(1, 'jack', 'jack@qq.com');
INSERT INTO t15 VALUES(1, 'tom', 'tom@qq.com');
INSERT INTO t15 VALUES(1, 'tom', 'xx@qq.com'); -- 这里违反了复合主键-- 主键的指定方式有两种
-- 1. 直接在字段后面指定:字段名 primary key
CREATE TABLE t16(id INT,`name` VARCHAR(32) PRIMARY KEY,email VARCHAR(32)
);-- 2. 在表定义最后写 primary key(列名)
CREATE TABLE t17(id INT,`name` VARCHAR(32),email VARCHAR(32),PRIMARY KEY(`name`)
);-- 4、使用desc 表名,可以看到primary key的情况
DESC t14SELECT * FROM t14
SELECT * FROM t15
如果在列上定义了not null,那么当插入数据时,必须为列提供数据
字段名 字段类型 not null
当定义了唯一约束后,该列值是不能重复的
字段名 字段类型 unique
细节说明:
1、如果没有指定not null,则unique字段可以有多个null
2、一张表可以有多个unique字段
-- unique 的使用CREATE TABLE t18(id INT UNIQUE, -- 表示id列是不可以重复的`name` VARCHAR(32),email VARCHAR(32)
);INSERT INTO t18 VALUES(1, 'jack', 'jack@qq.com');
INSERT INTO t18 VALUES(1, 'tom', 'tom@qq.com'); -- 错误的-- 细节说明:
--
-- 1、如果没有指定not null,则unique字段可以有多个null
-- 如果一个列(字段), 是 unique not null 使用效果类似 primary key
INSERT INTO t18 VALUES(NULL, 'tom', 'tom@qq.com');-- 2、一张表可以有多个unique字段
CREATE TABLE t19(id INT UNIQUE, -- 表示id列是不可以重复的`name` VARCHAR(32) UNIQUE, -- 表示 name 也不可以重复email VARCHAR(32)
);
DESC t19SELECT * FROM t18
用于定义主表和从表之间的关系:外键约束要定义在表上,主表则必须具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null
FOREIGN KEY(本表字段名) REFERENCES
主表名(主键名或unique字段名)
细节说明:
1、外键指向的表的字段,要求是primary key或者是unique
2、表的类型是innodb,这样的表才支持外键
3、外键字段的类型要和主键字段的类型一致(长度可以不同)
4、外键字段的值,必须在主键字段中出现过,或者为null【前提是外键字段允许为null】
5、一旦建立主外键的关系,数据不能随意删除了
-- 外键演示-- 创建主表 my_class
CREATE TABLE my_class (id INT PRIMARY KEY, `name` VARCHAR(32)NOT NULL DEFAULT ' '
);
INSERT INTO my_class VALUES(100, 'java'), (200, 'web')
INSERT INTO my_class VALUES(300, 'php')-- 创建从表 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)
);INSERT INTO my_stu VALUES(1, '张三', 100), (2, '李四', 200)
INSERT INTO my_stu VALUES(3, '老六', 300)
INSERT INTO my_stu VALUES(4, '王五', 400) -- 错误的,因为400班级不存在
INSERT INTO my_stu VALUES(5, '铁蛋', NULL) -- 可以添加,因为外键没有写 not null-- 一旦建立主外键的关系,数据不能随意删除了
DELETE TABLE my_class WHERE id = 100;SELECT * FROM my_class
SELECT * FROM my_stu
用于强制行数据必须满足的条件,假定在sal列上定义了check约束,并要求sal列值在1000~2000之间,如果不再1000~2000之间就会提示出错
提示:oracle和sql server均支持check,但是mysql5.7目前还不支持check,只做语法校验,但不会生效
列名 类型 CHECK(check条件)
-- 演示check的使用
-- mysql5.7目前还不支持check,只做语法校验,但不会生效
-- 学习 oracle, sql server, 这两个数据库是真的生效.-- 测试
CREATE TABLE t20 (id INT PRIMARY KEY, `name` VARCHAR(32),sex VARCHAR(6) CHECK(sex IN ('man', 'woman')),sal DOUBLE CHECK(sal > 1000 AND sal < 2000)
);INSERT INTO t20 VALUES(1, '张三', 'm', 1) -- 添加成功了SELECT * FROM t20
字段名 整型 PRIMARY KEY AUTO_INCREMENT
添加 自增长的字段方式:
inser into xxx(字段1,字段2.....)values(null,'值' ....);
inser into xxx(字段2.....)values('值1','值2' ....);
inser into xxx values(null,'值1',....);
使用细节:
1、 一般来说自增长是和primary key配合使用的
2、自增长也可以单独使用【但是需要配合一个unique】
3、自增长修饰的字段为整数型的(虽然小数也可以但是非常非常少这样使用)
4、自增长默认从1开始,可以通过如下命令修改:alter table 表名 auto_increment = 新的开始值
5、如果添加数据时,给自增长字段(列)指定的有值,则以指定的值为准,如果指定了自增长,一般来说就按照自增长的规则来添加数据
-- 演示自增长的使用
CREATE TABLE t21(id INT PRIMARY KEY AUTO_INCREMENT,email VARCHAR(32) NOT NULL DEFAULT ' ',`name` VARCHAR(32 ) NOT NULL DEFAULT ' '
);-- 测试自增长
INSERT INTO t21 VALUES(NULL, 'jack@qq.com', 'jack');
INSERT INTO t21 VALUES(NULL, 'tom@qq.com', 'tom');INSERT INTO t21 (email, `name`) VALUES('mary@qq.com', 'mar');DESC t21
SELECT * FROM t21-- 修改默认的自增长值
ALTER TABLE t22 AUTO_INCREMENT = 100;
CREATE TABLE t22(id INT PRIMARY KEY AUTO_INCREMENT,email VARCHAR(32) NOT NULL DEFAULT ' ',`name` VARCHAR(32 ) NOT NULL DEFAULT ' '
);INSERT INTO t22 VALUES(NULL, 'jack@qq.com', 'jack');
INSERT INTO t22 VALUES(NULL, 'tom@qq.com', 'tom');-- 如果添加数据时,给自增长字段(列)指定的有值,则以指定的值为准,
-- 如果指定了自增长,一般来说就按照自增长的规则来添加数据
INSERT INTO t22 VALUES(666, 'mary@qq.com', 'mar');SELECT * FROM t22;