ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL约束

2021-09-22 20:36:22  阅读:156  来源: 互联网

标签:insert name into 约束 vip values MySQL 主键


什么是约束?

约束对应的英语单词:constraint
在创建表的时候,可以给表中的字段加上一些约束,来保证这个表中数据的完整性、有效性

约束的作用就是为了保证表中的数据有效

约束包括哪些?

非空约束:not null
唯一性约束:unique
主键约束:primary key(简称PK)
外键约束:foreign key(简称FK)
检查约束:check(mysql不支持,oracle支持)

非空约束 not null

非空约束not null 约束的字段不能为null

create table t_vip(
	id int,
	name varchar(255) not null
);

insert into t_vip(id,name) values(1,'张三');
insert into t_vip(id,name) values (2,'李四');
insert into t_vip(id,name) values (3); #报错,设有not null 的字段不能为空,必须插入数据

not null只有列级约束,没有表级约束

唯一性约束:unique

唯一性约束unique约束的字段不能重复,但是可以为null

drop table if exists t_vip;

create table t_vip(
	id int,
	name varchar(255) unique,
	email varchar(255)
);

insert into t_vip(id,name,email) values (1,'张三','zhangsan@qq.com');
insert into t_vip(id,name,email) values (2,'李四','lisi@qq.com');
insert into t_vip(id,name,email) values (3,'王五','wangwu@123.com');

select * from t_vip;
insert into t_vip(id,name,email) values (4,'王五','wangwu@996.com'); #报错,字段有unique约束,具有唯一性,不能重复

insert into t_vip(id) values(5);
insert into t_vip(id) values(6);
#虽然被unique约束了,但是可以为null

两个字段联合起来具有唯一性

drop table if exists t_vip;

#约束添加在列的后面,这种约束被称为列级约束
#约束没有添加在列的后面,这种约束被称为表级约束
create table t_vip(
	id int,
	name varchar(255),
	email varchar(255),
	unique(name,email) #两个字段联合起来唯一
);
insert into t_vip(id,name,email) values (1,'zhangsan','zhangsan@123.com');
insert into t_vip(id,name,email) values (2,'zhangsan','zhangsan@sina.com');
select * from t_vip;
insert into t_vip(id,name,email) values (3,'zhangsan','zhangsan@sina.com'); #报错, Duplicate entry 'zhangsan-zhangsan@sina.com' for key 't_vip.name'

什么时候使用表级约束?

需要给多个字段联合起来添加某一个约束的时候,需要使用表级约束

unique和notnull可以联合使用

drop table if exists t_vip;

create table t_vip(
	id int,
	name varchar(255) not null unique
);

insert into t_vip(id,name) values (1,'zhangsan');

insert into t_vip(id,name) values (2,'zhangsan'); #错误,unique约束

insert into t_vip(id) values (3); #错误,not null约束

在MySQL当中,如果一个字段同时被not null 和 unique约束的话,该字段会自动变成主键

主键约束(primary key,简称PK)

主键约束的相关术语:

  • 主键约束:就是一种约束
  • 主键字段:该字段上添加了主键约束,这样的字段叫做:主键字段
  • 主键值:主键字段中的每一个值叫做:主键值

什么是主键?有啥用?
主键值是每一个记录的唯一标识
主键值是每一行记录的身份证号
任何一张表都应该有主键,没有主键,表无效

主键的特征:not null + unique(主键值不能是null,同时也不能重复)

给一张表添加主键约束

drop table if exists t_vip;

create table t_vip(
	#一个字段做主键叫做:单一主键
	id int primary key, #列级约束	
	name varchar(255)
);

insert into t_vip(id,name) values (1,'zhangsan');
insert into t_vip(id,name) values (2,'lisi');

#错误,主键不能重复
insert into t_vip(id,name) values (2,'wangwu');
select * from t_vip;

insert into t_vip(name) values ('zhaoliu'); #错误,主键不能为空


#主键可以使用表级约束
create table t_vip(
	id int,
	name varchar(255),
	primary key(id) #表级约束
);
insert into t_vip(id,name) values (1,'zhangsan');
insert into t_vip(id,name) values (2,'lisi');
#错误:重复
insert into t_vip(id,name) values (2,'wangwu');

#表级约束主要是给多个字段联合起来添加约束
create table t_vip(
	#id和name联合起来做主键:复合主键
	id int,
	name varchar(255),
	email varchar(255),
	primary key(id,name)
);
insert into t_vip(id,name,email) values (1,'zhangsan','zhangsan@123.com');
insert into t_vip(id,name,email) values (1,'lisi','lisi@123.com');
select * from t_vip;
#错误:不能重复
insert into t_vip(id,name,emali) values (1,'zhangsan','abc@123.com');

#错误: Multiple primary key defined  一张表,主键约束只能添加一个
create table t_vip(
	id int primary key, 
	name varchar(255) primary key
);

主键值建议使用:

  • int
  • bigint
  • char
  • 等类型

不建议使用:varchar来做主键,主键值一般都是数字,一般都是定长的

主键:除了单一主键和复合主键之外,还可以这样进行分类

  • 自然主键:主键值是一个自然数,和业务没关系
  • 业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值,这就是业务主键

实际开发中自然主键使用比较多,因为主键只要做到不重复就行,不需要有意义
业务主键不好,因为主键一旦与业务挂钩,那么当业务发生变动的时候,可能会影响
到主键值,所以业务主键不建议使用,尽量使用自然主键

#mysql中,有一种机制,可以帮助自动维护一个主键值
create table t_vip(
	id int primary key auto_increment,
	name varchar(255)
);
insert into t_vip(name) values ('张三');
insert into t_vip(name) values ('张三');
insert into t_vip(name) values ('张三');
insert into t_vip(name) values ('张三');
insert into t_vip(name) values ('张三');
insert into t_vip(name) values ('张三');
insert into t_vip(name) values ('张三');
select * from t_vip;

外键约束(foreign key,简称FK)

外键约束涉及到的相关术语:

  • 外键约束:一种约束(foreign key)
  • 外键字段:该字段上添加外键约束
  • 外键值:外键字段当中的每一个值

子表和父表之间的顺序

删除表的顺序

  • 先删子,再删父

创建表的顺序

  • 先创建父,再创建子

删除数据的顺序

  • 先删子,再删父

插入数据的顺序

  • 先插入父,再插入子

思考:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?

不一定是主键,但至少具有unique约束

设计一张数据库表,来描述"班级和学生"信息

drop table if exists t_student;
drop table if exists t_class;


#请设计一张数据库表,来描述"班级和学生"的信息
create table t_class(
	classno int primary key,
	classname varchar(255)
);

create table t_student(
	no int primary key auto_increment,
	name varchar(255),
	cno int,
	foreign key(cno) references t_class(classno) #外键约束
);

insert into t_class(classno,classname) values (110,'麻省理工软件与信息工程学院1班');
insert into t_class(classno,classname) values (111,'麻省理工软件与信息工程学院2班');

insert into t_student(name,cno) values ('Jack',110);
insert into t_student(name,cno) values ('Marry',110);
insert into t_student(name,cno) values ('Lucy',110);
insert into t_student(name,cno) values ('Cedric',110);
insert into t_student(name,cno) values ('zhangsan',110);
insert into t_student(name,cno) values ('lisi',111);
insert into t_student(name,cno) values ('wangwu',111);
insert into t_student(name,cno) values ('zhaoliu',111);
insert into t_student(name,cno) values ('Smith',111);

select * from t_class;
select * from t_student;

#外键字段可以为null
insert into t_student(name) values ('qiqi');

标签:insert,name,into,约束,vip,values,MySQL,主键
来源: https://www.cnblogs.com/cedric1114/p/15317575.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有