MySQL数据库与建表约束

文章中所有操作均是在 MySQL 5.7 版本下进行的

在创建表的时候,一些建表约束是我们经常碰到的问题,这些约束提供了更严谨和完善的建表操作,这些约束都是约束表中的列(字段)上的。

建表约束

MySQL 建表约束一共有如下几种:

  • 非空约束
  • 默认约束
  • 主键约束
  • 唯一约束
  • 外键约束
  • 自增长约束

非空约束(not null)

非空约束,用来修饰字段不能为空(not null)。默认情况下,字段是默认可以为空(null),我们可以通过 not null 来约束字段不能为空(not null)。如下示例:

-- 创建表的时候直接非空约束
drop table if exists tbl_test;
create table tbl_test(
    id      int null,
    info1	varchar(50) null,	 -- 不设置默认为null
    info2	varchar(50) not null -- 非空约束
);

-- 创建表之后修改表中的某个列为非空约束
alter table tbl_test modify column info1 varchar(50) not null;

默认约束(default)

默认约束,就是表示当我们插入记录时,如果没有传值,就会使用默认值。如下示例:

drop table if exists tbl_test;
create table tbl_test(
    id      int null,
    info1	varchar(50) null,
    info2	varchar(50) default '1'   ---设置默认值为1
);

-- 创建表之后修改表中的某个列为默认约束
alter table tbl_test modify column info1 varchar(50) default '1';

主键约束(primary key)

主键约束应该是在学习和接触数据库建表的时候,最先接触到的约束。毕竟不管是学习数据库,还是应用数据库,只要涉及到表的数据存储和读取,那主键(主键约束)都是必须的。我们都知道每个表主键只有一个(不要混淆概念,这里说的主键只有一个,但是主键可以是多个列组成)。主键约束要求非空,不可重复,因为需要通过主键定位唯一一条数据(实例)。如下示例:

一个表其实是可以没有主键的,但是没有主键的表后续的程序开发那是相当难受

-- 建表的时候直接设置主键
drop table if exists tbl_test;
create table tbl_test(
    id      int primary key,
    info1	varchar(50) null,
    info2	varchar(50) null
);

-- 还可以这样
drop table if exists tbl_test;
create table tbl_test(
    id      int,
    info1	varchar(50) null,
    info2	varchar(50) null,
    primary key(id)
);

-- 如果创建表的时候忘了设置主键约束
drop table if exists tbl_test;
create table tbl_test(
    id      int,
    info1	varchar(50) null,
    info2	varchar(50) null
);
alter table tbl_test add primary key(id);
-- 还可以 alter table tbl_test modify column id int primary key;
-- 另外删除主键约束 alter table tbl_test drop primary key;

-- 复合主键(联合主键)
drop table if exists tbl_test;
create table tbl_test(
    id1     int,
    id2     int,
    info1	varchar(50) null,
    info2	varchar(50) null,
    primary key(id1,id2)
);

唯一约束(unique)

唯一约束,就是约束字段的值不可以重复(唯一约束的字段是可以插入 null 的)。如下示例:

-- 创建表的时候直接加入唯一约束
drop table if exists tbl_test;
create table tbl_test(
    id1     int primary key,
    id2		int unique, -- 直接加入唯一约束
    id3     int,
    info1	varchar(50) null,
    info2	varchar(50) null
);

-- 还可以这样
drop table if exists tbl_test;
create table tbl_test(
    id1     int primary key,
    id2		int,
    id3     int,
    info1	varchar(50) null,
    info2	varchar(50) null,
    unique(id2)
);

-- 如果创建表的时候忘了设置唯一约束
drop table if exists tbl_test;
create table tbl_test(
    id1     int primary key,
    id2		int,
    id3     int,
    info1	varchar(50) null,
    info2	varchar(50) null
);
alter table tbl_test add unique(id2);
-- 还可以 alter table tbl_test modify column id2 int unique;
-- 另外删除唯一约束 alter table tbl_test drop index id2;

-- 类似复合主键(联合主键)的唯一约束
drop table if exists tbl_test;
create table tbl_test(
    id1     int primary key,
    id2		int,
    id3     int,
    info1	varchar(50) null,
    info2	varchar(50) null,
    unique(id2,id3)
);

外键约束(foreign key … references)

外键约束是建立在两个(多个)表情况下,最基本的就是主表(父表)和副表(子表),而且外键约束是和主键约束一起来讨论的。如下示例:

-- 主表 班级表
create table tbl_class(
    id     		int primary key,  -- 主键 班级id
    class_name	varchar(50)
);
-- 副表 学生表
create table tbl_student(
    id     		int primary key,  -- 主键 学生id
    stu_name	varchar(50),
    class_id	int,	-- 外键,所属班级的id
    foreign key(class_id) references tbl_class(id)
);
/* 如果在创建副表(学生表)的时候没有创建外键,可以通过以下命令: alter table tbl_student add foreign key(class_id) references tbl_class(id); 移除掉外键约束,可以用以下命令: alter table tbl_student drop foreign key 外键key的名称; 外键key的名称可以通过 show create table tbl_student; 命令查看 */

自增长约束(auto_increment)

自增长约束,就是字段的值可以自动增长,说白了插入数据时候,自增长的列不用指定自增长列的数据,MySQL 会自动生成值。自增长约束一般是和主键约束联合使用的,如下示例:

-- 创建表加入自增长
drop table if exists tbl_test;
create table tbl_test(
    id1     int primary key auto_increment,
    id2		int,
    info1	varchar(50) null,
    info2	varchar(50) null
);

-- 自增长默认是从1开始增加的,可以设置它从任何数开始,例如从20开始(谨慎)
alter table tbl_test auto_increment = 20; 

MySQL 的自增长和别的数据库是有差别的,而且不同存储引擎、不同版本也有一些不同的特性。而且有的朋友也会提问,难道不能在普通的 int 类型列上使用自增长吗?!其实当你在操作普通的 int 类型列上的时候会有个错误提示,关于这个问题作者有一篇文章单独的进行了具体的分析。

结语

数据库的建表约束,可以在建表的时候起到一定的规范约束,但是这个是在数据库建表的层面上。其实平时的程序开发,不会去设置这么多复杂的约束,有时候这些约束反而会引起程序(开发阶段)报错,往往这些错误不好区分到底是程序还是数据库表上的问题。

本文地址:https://blog.csdn.net/lili40342/article/details/107140385

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐