> 文章列表 > 【数据库】MySQL数据约束和表关系详解

【数据库】MySQL数据约束和表关系详解

【数据库】MySQL数据约束和表关系详解

目录

1.数据库约束

1.1约束类型

1.2NULL约束

1.3UNIQUE:唯一约束

1.4DEFAULT:默认值约束

1.5PRIMARY:主键约束

1.6FOREIGH KEY:外键约束

2.表的关系

2.1一对一

2.2一对多

2.3多对多


1.数据库约束

数据库中的数据保存在数据表中,在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,比如:数据类型和约束。

约束的概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

作用:保证数据库中数据的正确、有效性和完整性。

注意约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束

1.1约束类型

约束类型 解释
NOT NULL 指示某列不能存储null值
UNIQUE 保证某列的每行必须有唯一的值
DEFAULT 规定没有给列赋值时的默认值
PRIMARY KEY NOT NULL和UNIQUE的结合,确保某列有唯一标识,有助于更快速的找到表中的一个特定记录
FOREIGN KEY 保证一个表中的数据匹配另一个表中的值的参照完整性
CHECK 保证列中的值符合指定的条件

1.2NULL约束

null约束在创建表时,可以指定某列不为空。

例如:创建student表时,指定id不为空。

-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
create table student(id int not null,sn int unique,name varchar(20) default 'no name');

插入一条id为null的语句,可以看到错误提醒。

insert into student(id,sn,name)values(null,1,'星星');

1.3UNIQUE:唯一约束

设置了 UNIQUE 约束的字段,每条记录的值都必须是唯一的,因此 UNIQUE 约束可以防止两条记录在某个字段上出现重复值。

例如:创建student表时,指定sn为唯一约束

create table student(id int not null,sn int unique,name varchar(20) default 'no name');

此时表中已有两条数据。

再插入一条sn为1的数据,再次新增直接报错。

insert into student values(3,1,'阳阳');

1.4DEFAULT:默认值约束

默认值约束即DEFAULT用于给数据表中的字段指定默认值,即当在表中插入一条新记录时若未给该字段赋值,那么,数据库系统会自动为这个字段插人默认值。

例如:创建student表时,给name一个默认值“no name”。

create table student(id int not null,sn int unique,name varchar(20) default 'no name');

现在插入一条未给name赋值的记录。

insert into student(id,sn)values(3,3);

查看student表,name列为"no name".

1.5PRIMARY:主键约束

MySQL主键约束是一个列或者多个列的组合,其值能唯一地标识表中的每一行,方便在RDBMS中尽快的找到某一行。主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。但每个表最多只允许一个主键。主键约束的关键字是primary key,当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。

添加单列主键:

语法:

create table 表名(...<字段名> <数据类型> primary key ...
)

实现代码如下:

create table student(id int primary key,sn int unique,name varchar(20) default 'no name',email varchar(20));

添加多列主键(联合主键):

所谓的联合主键,就是这个主键是由一张表中多个字段组成的。若主键是由多个字段组成时,不能直接在字段名后面声明主键约束。一张表只能有一个主键,联合主键也是一个主键。

语法:

create table 表名(...primary key (字段1,字段2,…,字段n)
);

实现代码:

create table emp3( name varchar(20), deptId int, salary double, primary key(name,deptId) 
);

主键约束不仅可以在创建表的同时创建,也可以在修改表时添加,语法格式如下:

create table 表名(...
);
alter table <表名> add primary key(字段列表);

实现代码:

-- 添加单列主键
create table emp4(eid int, name varchar(20), deptId int, salary double, 
);
alter table emp4 add primary key(eid);
对于整数类型的主键,常配搭自增长auto_increment 来使用。插入数据对应字段不给值时,使用最大值+1.
-- 主键是 NOT NULL 和 UNIQUE 的结合,可以不用 NOT NULLid INT PRIMARY KEY auto_increment,

1.6FOREIGH KEY:外键约束

MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。

外键约束的特点:

定义一个外键时,需要遵守下列规则:

1.主表必须已经存在于数据库中,或者是当前正在创建的表。

2.必须为主表定义主键

3.主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这 个外键的内容就是正确的。

创建外键约束:

方法1,在创建表时设置外键约束。

语法:

[constraint <外键名>] foreign key 字段名 [,字段名2,…] references <主表名> 主键列1 [,主键列2,…]

实现代码:

创建课程表(主表)

drop table course;
create table course(id int primary key,name varchar(20));

创建学生表(从表)

drop table student;
create table student(id int primary key,name varchar(20) default 'no name',age int,course_id int,foreign key(course_id) references course(id));

方法2,在修改表时设置外键约束。

语法:

alter table <数据表名> add constraint <外键名> foreign key(<列名>) references 
<主表名> (<列名>);

实现代码:

create table course(id int primary key,name varchar(20));create table student(id int primary key,name varchar(20) default 'no name',age int,course_id int);alter table student add constraint course_id foreign key(course_id) references student (id);

2.表的关系

在数据库中,单表的操作是最简单的。一对一、一对多、多对多是关系型数据库中表与表之间的常见的关联关系

2.1一对一

第一个表中的单个行只可以与第二个表中的一个行相关,且第二个表中的一个行也只可以与第一个表中的一个行相关。

例如:一个人只能对应一个身份证号。

2.2一对多

该关系中第一个表中的单个行可以与第二个表中的一个或多个行相关,但第二个表中的一个行只可以与第一个表中的一个行相关。

例如:一个班级可以有多个学生,班级表中班级号码可以与学生表中多个学生相关,但是学生表中一个学生只能在一个班级。

2.3多对多

该关系中第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。

例如:已经有了一个学生表和一个课程表,再添加一个学生课程中间表,即成绩表,在这个表中,存储每一个学生每门课的成绩。

代码:

-- 创建课程学生中间表:考试成绩表
DROP TABLE IF EXISTS score;
CREATE TABLE score (id INT PRIMARY KEY auto_increment,score DECIMAL(3, 1),student_id int,course_id int,FOREIGN KEY (student_id) REFERENCES student(id),FOREIGN KEY (course_id) REFERENCES course(id)
);