欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL数据库与建表约束

程序员文章站 2022-04-19 14:15:55
文章中所有操作均是在 MySQL 5.7 版本下进行的在创建表的时候,一些建表约束是我们经常碰到的问题,这些约束提供了更严谨和完善的建表操作,这些约束都是约束表中的列(字段)上的。建表约束MySQL 建表约束一共有如下几种:非空约束默认约束主键约束唯一约束外键约束自增长约束非空约束(not null)非空约束,用来修饰字段不能为空(not null)。默认情况下,字段是默认可以为空(null),我们可以通过 not null 来约束字段不能为空(not null)。如下示例:.....

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