Mysql约束

约束

  • 基本概念
  • 非空约束 not null
  • 唯一性约束
    • 列级唯一性约束
    • 表级唯一性约束
  • 主键约束
    • 单一主键
    • 复合主键
    • 使用表级约束方式定义主键
    • 主键值自增
  • 外键约束
    • 基本语法:
    • 关于外键约束的相关术语
    • 案例引入
    • 顺序要求:
    • 注意点

基本概念

  • 什么是约束?
    在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的
    合法性、有效性、完整性。
  • 常见的约束有哪些呢?
    非空约束(not null):约束的字段不能为NULL
    唯一约束(unique):约束的字段不能重复
    主键约束(primary key):约束的字段既不能为NULL,也不能重复(简称PK)
    外键约束(foreign key):(简称FK)
    检查约束(check):注意Oracle数据库有check约束,但是mysql没有,目前mysql不支持该约束。

非空约束 not null

例:创建一个t_user表,其中username不允许为空。

create table t_user(
		id int,
		username varchar(255) not null,
		password varchar(255)
	);

此时执行数据插入时若password对应项为空则报错:
insert into t_user(id,password) values(1,'123');

ERROR 1364 (HY000): Field 'username' doesn't have a default valueERROR 1364 (HY000): Field 'username' doesn't have a default value

唯一性约束

唯一约束修饰的字段具有唯一性,不能重复。但可以为NULL。

列级唯一性约束

create table t_user(id int,username varchar(255) unique);
其中username被添加了唯一约束,此时若重复插入username一样的数据会报错:
insert into t_user(id,username) values(1,'zhangsan');
insert into t_user(id,username) values(2,'zhangsan');

ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 't_user.username'

表级唯一性约束

create table t_user(
			id int, 
			usercode varchar(255),
			username varchar(255),
			unique(usercode,username) 
		);

此时多个字段联合起来添加1个约束unique。
我们可以向表内添加任何(username,usercode)不重复的数据。如:

insert into t_user values(1,'111','zs');
insert into t_user values(2,'111','ls');
insert into t_user values(3,'222','zs');

结果是添加成功:

+------+----------+----------+
| id   | username | usercode |
+------+----------+----------+
|    1 | 111      | zs       |
|    2 | 111      | ls       |
|    3 | 222      | zs       |
+------+----------+----------+

但是当我们添加(username,usercode)相同的数据时就会报错:
insert into t_user values(4,'111','zs');

ERROR 1062 (23000): Duplicate entry '111-zs' for key 'usercode'

如果想要username和usercode分别是唯一的,则需分别添加唯一性约束。

create table t_user(
			id int, 
			usercode varchar(255) unique,
			username varchar(255) unique
		);

表级唯一性约束也可以只对单一字段进行约束,效果和列级约束一样

主键约束

  • 主键分为单一主键和复合(联合)主键,单一主键是由一个字段构成的,复合(联合)主键是由多个字段构成的。

  • 主键有什么作用?

    • 表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键。
    • 主键的作用:主键值是这行记录在这张表当中的唯一标识。(就像一个人的身份证号码一样。)
  • 主键的特点:不能为NULL,也不能重复。

  • 一张表的主键约束只能有1个。

  • 主键相关的术语?
    主键约束 : primary key
    主键字段 : id字段添加primary key之后,id叫做主键字段
    主键值 : id字段中的每一个值都是主键值。

  • 主键的分类?
    根据主键字段的字段数量来划分:

    • 单一主键(推荐的,常用的。)
    • 复合主键(多个字段联合起来添加一个主键约束)(复合主键不建议使用,因为复合主键违背三范式。)

    根据主键性质来划分:

    • 自然主键:主键值最好就是一个和业务没有任何关系的自然数。(这种方式是推荐的)
    • 业务主键:主键值和系统的业务挂钩,例如:拿着银行卡的卡号做主键,拿着身份证号码作为主键。(不推荐用)
      最好不要拿着和业务挂钩的字段作为主键。因为以后的业务一旦发生改变的时候,主键值可能也需要随着发生变化,但有的时候没有办法变化,因为变化可能会导致主键值重复。

单一主键

create table t_user(
			id int primary key,  // 列级约束
			username varchar(255),
			email varchar(255)
		);
insert into t_user(id,username,email) values(1,'zs','[email protected]');
		insert into t_user(id,username,email) values(2,'ls','[email protected]');
		insert into t_user(id,username,email) values(3,'ww','[email protected]');
		select * from t_user;
		+----+----------+------------+
		| id | username | email      |
		+----+----------+------------+
		|  1 | zs       | [email protected] |
		|  2 | ls       | [email protected] |
		|  3 | ww       | [email protected] |
		+----+----------+------------+

在添加了主键的表中不能添加重复的数据:
insert into t_user(id,username,email) values(1,'jack','[email protected]');

ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

也不能不添加数据,即不能为空
insert into t_user(username,email) values('jack','[email protected]');

ERROR 1364 (HY000): Field 'id' doesn't have a default value

复合主键

create table t_user(
				id int,
				username varchar(255),
				password varchar(255),
				primary key(id,username)
			);

使用表级约束方式定义主键

create table t_user(
			id int,
			username varchar(255),
			primary key(id)
		);

主键值自增

create table t_user(
			id int primary key auto_increment, 
			username varchar(255)
		);

id字段自动维护一个自增的数字,从1开始,以1递增。

insert into t_user(username) values('a');
		insert into t_user(username) values('b');
		insert into t_user(username) values('c');
		insert into t_user(username) values('d');
		insert into t_user(username) values('e');
		insert into t_user(username) values('f');
		select * from t_user;
+----+----------+
| id | username |
+----+----------+
|  1 | a        |
|  2 | b        |
|  3 | c        |
|  4 | d        |
|  5 | e        |
|  6 | f        |
+----+----------+

外键约束

基本语法:

foreign key(子表字段名) references 父表名(父表被引用字段名)

关于外键约束的相关术语

  • 外键约束: foreign key
  • 外键字段:添加有外键约束的字段
  • 外键值:外键字段中的每一个值。

案例引入

请设计数据库表,用来维护学生和班级的信息?

  • 方法1:一张表存储所有数据
no(pk)	   name			 classno	  classname
-------------------------------------------------------
1			zs1				101				高三1班
2			zs2				101				高三1班
3			zs3				102				高三2班
4			zs4				102				高三2班
5			zs5				102				高三2班
  • 方法2:两张表(班级表和学生表)

t_class 班级表

cno(pk)		cname
-----------------------
101		    高三1班
102		   高三2班

t_student 学生表

sno(pk)		sname		classno(该字段添加外键约束fk)
--------------------------------------------------
1		    zs1				101
2			zs2				101
3			zs3				102
4			zs4				102
5			zs5				102

t_student中的classno字段引用t_class表中的cno字段,此时t_student表叫做子表。t_class表叫做父表。

顺序要求:

  • 删除数据的时候,先删除子表,再删除父表。
  • 添加数据的时候,先添加父表,在添加子表。
  • 创建表的时候,先创建父表,再创建子表。
  • 删除表的时候,先删除子表,在删除父表。
drop table if exists t_student;
drop table if exists t_class;

create table t_class(
	cno int,
	cname varchar(255),
	primary key(cno)
);

create table t_student(
	sno int,
	sname varchar(255),
	classno int,
	primary key(sno),
	foreign key(classno) references t_class(cno)
);

注意点

  • 外键可以为NULL。
  • 被引用的字段不一定是主键,但至少具有unique约束。

你可能感兴趣的:(数据库,mysql,sql,数据库)