目录
概述
对表中的数据进行限制,保证数据的正确性、有效性和完整性。一个表如果添加了约束,不正确的数据将无法插入到表中。约束在创建表的时候添加比较合适。
约束种类
约束名 | 约束关键字 |
主键 | primary key |
唯一 | unique |
非空 | not null |
外键 | foreign key |
检查约束 | check 注:mysql 不支持 |
主键约束
主键的作用:用来唯一标识数据库中的每一条记录。
通常不用业务字段作为主键,单独给每张表设计一个 id 的字段,把 id 作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。
如:身份证,学号不建议做成主键。
主键关键字: primary key , 特点: 非空 not null 唯一。
-
1. 在创建表的时候给字段添加主键
字段名 字段类型 PRIMARY KEY |
-
2. 在已有表中添加主键
ALTER TABLE 表名 ADD PRIMARY KEY(字段名); |
演示:
-- 创建表学生表 st5, 包含字段(id, name, age)将 id 做为主键 create table st5 ( id int primary key, -- id 为主键 name varchar(20), age int ); desc st5; |
-- 插入重复的主键值 insert into st5 values (1, '关羽', 30); -- 错误代码: 1062 Duplicate entry '1' for key 'PRIMARY' insert into st5 values (1, '关云长', 20); select * from st5; -- 插入 NULL 的主键值, Column 'id' cannot be null insert into st5 values (null, '关云长', 20); |
-
删除主键:
-- 删除 st5 表的主键 alter table st5 drop primary key; -- 添加主键 alter table st5 add primary key(id); |
-
主键自增:
主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值
AUTO_INCREMENT 表示自动增长( 字段类型必须是整数类型 ) |
演示:
-- 创建表学生表 st6, 包含字段(id, name, age)将 id 做为主键 create table st6 ( id int primary key auto_increment, -- id 为主键 name varchar(20), age int ); -- 插入数据 insert into st6 (name,age) values ('小乔',18); insert into st6 (name,age) values ('大乔',20); -- 另一种写法 insert into st6 values(null,'周瑜',35); select * from st6; |
修改自动增长的默认起始值:
默认地 AUTO_INCREMENT 的开始值是 1,如果希望修改起始值,请使用下列 SQL 语法
- 创建表时指定起始值:
CREATE TABLE 表名( 列名 int primary key AUTO_INCREMENT ) AUTO_INCREMENT=起始值; |
演示:
-- 指定起始值为 1000 create table st4 ( id int primary key auto_increment, name varchar(20) ) auto_increment = 1000; insert into st4 values (null, '孔明'); select * from st4; |
-
创建好以后修改起始值
ALTER TABLE 表名 AUTO_INCREMENT= 起始值; |
演示:
alter table st4 auto_increment = 2000; insert into st4 values (null, '刘备'); select * from st4; |
DELETE 和 TRUNCATE 对自增长的影响:
DELETE:删除所有的记录之后,自增长没有影响。
TRUNCATE:删除以后,自增长又重新开始。TRUNCATE是把表结构DROP 之后 再CREATE。
唯一约束
什么是唯一约束: 表中某一列不能出现重复的值。
-
唯一约束的基本格式:
字段名 字段类型 UNIQUE |
-
实现唯一约束:
-- 创建学生表 st7, 包含字段(id, name),name 这一列设置唯一约束,不能出现同名的学生 create table st7 ( id int, name varchar(20) unique ); -- 添加一个同名的学生 insert into st7 values (1, '张三'); select * from st7; -- Duplicate entry '张三' for key 'name' insert into st7 values (2, '张三'); -- 重复插入多个 null 会怎样? insert into st7 values (2, null); insert into st7 values (3, null); null 没有数据 , 不存在重复的问题 |
非空约束
什么是非空约束:列值不能为 null。
-
非空约束的基本语法格式:
字段名 字段类型 NOT NULL |
演示:
-- 创建表学生表 st8, 包含字段(id,name,gender)其中 name 不能为 NULL create table st8 ( id int, name varchar(20) not null, gender char(1) ); -- 添加一条记录其中姓名不赋值 insert into st8 values (1,'张三疯','男'); select * from st8; -- Column 'name' cannot be null insert into st8 values (2,null,'男'); |
-
默认值:
字段名 字段类型 DEFAULT 默认值 |
演示:
-- 创建一个学生表 st9,包含字段(id,name,address), 地址默认值是广州 create table st9 ( id int, name varchar(20), address varchar(20) default '广州' ); -- 添加一条记录,使用默认地址 insert into st9 values (1, '李四', default); insert into st9 (id,name) values (2, '李白'); -- 添加一条记录,不使用默认地址 insert into st9 values (3, '李四光', '深圳'); select * from st9; |
疑问:如果一个字段设置了非空与唯一约束,该字段与主键的区别?
1) 主键在一个表中,只能有一个。不能出现多个主键。主键可以单列,也可以是多列。
2) 自增长只能用在主键上
-
组合主键演示:
-- 创建一个学生表 st10,组合主键 (id , name) create table st10 ( id int, name varchar(20), sex char(1), address varchar(20) default '广州', PRIMARY key (id,name) ); insert into st10 values(1,'小美','女','东京'); -- [Err] 1062 - Duplicate entry '1-小美' for key 'PRIMARY' insert into st10 values(1,'小美','男','长清'); |