对于约束来说,是一种限制数据的方式,这里的约束和生活中的约束是差不多的,比如数据来说,生活中的语文成绩在150以内,0分以上,如果有谁给你说我语文考了151分,那指定是扯淡,同样的,拿我们班级中的学号来举例,学号不能有重复的吧?在MySQL中就可以通过主键或者是唯一键来约束数据不能重复,等等等等。
说白了,我们学习这里的约束和结合生活中的场景是非常容易理解的,那么话不多说,我们直接进入主题。
对于第一个约束来说,null,也就是我们在C语言学习的空属性,它代表了一个数据是否能为空,就像这样:
create table if not exists test_null(
id varchar(20) not null, age int not null, address char(20)
);
我们创建一个表,表名为test_null,其中包括了三个字段,两个字段设置为了not null, 一个字段我们没有做任何的处理,我们可以先desc这个表看看address是否能为空:
在表格里address没有经过处理,它的NULL属性设置为了YES,也就是可以为空,所以插入数据的时候我们可以不管它,但是其他的一定不能啥也不插入,毕竟它需要有数据咯。
对于第二个约束来说,default,它的英文是默认的意思,我们结合C++的语言特性,有一个参数叫做缺省参数,也就是默认参数,对于默认参数来说,如果我们传了参数,那么用的就是我们传的参数,如果我们没有传参数,那么使用的就是原来给定的默认参数。
那么default这里也是一样的,我们创建一个表试试:
create table if not exists test_default(
age int default 18, id int default 1 not null, grade int default 100
);
这是固定语法,如果我们写成default=18,就报错了:
当我们使用desc之后,我们也能看到对应的default的属性:
那么它就是一个普通的缺省参数,相信有了语言方面的基础理解这个是非常容易的。
对于第三个约束来说,comment,老实说它算不上一个约束,它只是一个列描述,或者说是注释而已,我们在desc的表里面还看不到我们的注释,我们只能通过show create table table_name看到:
create table if not exists test_comment( age int default 18 comment 'Test for comment' );
所以这个”约束“我们了解一下,语法也特别简单。
mysql> show create table tt3\G
***************** 1. row *****************
Table: tt3
Create Table: CREATE TABLE `tt3` (
`a` int(10) unsigned DEFAULT NULL,
`b` int(10) unsigned DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=gbk
1 row in set (0.00 sec)
介绍zerofill之前,我们show一下表tt3,我们可以发现其中的两个数据的数据类型后面都带上了int(10)这个标志,其实在centos环境下我们一般是可以看到这个10的,但是在Ubuntu环境下这个是10似乎是被省略了,但是不影响。
对于初学MySQL的同学来说看到10肯定是蒙蔽的,我们从数据的大小,int的大小是4字节,和10也没有关系。其实这个10是数据的宽度,在这里的宽度和我们平常生活中认为的宽度是一样的,就是数据有多宽,比如int类型的数据1111,有四个字符,那么它的宽度就是4,这是int后面的含义。
那么和我们介绍的zerofill有什么关系呢?对于zerofill来说,英文翻译一下就是填充0的意思,那么我们结合C语言的printf想一想,填充0?我们好像有点印象,是不是这样使用的:
int main()
{
int a = 12;
printf("a = %012d", a);
return 0;
}
这好像是自动补齐了0吧?补齐了到了12位,那么超过了指定的宽度大小会怎么样?
int main()
{
int a = 12121212;
printf("a = %04d", a);
return 0;
}
超过了指定的宽度那么就不管这个宽度了我们。
对于这里的zerofill也是一样的,我们试试即可:
mysql> create table test_zerofill(
-> a int(4) zerofill not null default 12,
-> b int(10) zerofill not null default 111,
-> c int zerofill
-> );
insert into test_zerofill values(123456,123456,1212);
此时我们就能明显的看到zerofill的作用,对于b和c来说,一个我们指定了宽度,一个我们没有指定宽度,可以发现默认的宽度就是10,结合实际场景来看,我们仍然发现没有达到宽度的用零补齐,其实和C语言的printf没有两样~
对于约束来说,这些各种键才是今天的大头。
首先登场的就是主键,主键是primary key,那么什么是主键?你想,一个班级中,每个学生都应该有一个独一无二的东西吧?那就是学号,如果是名字的话,是有可能重复的,那么主键的含义就是表示表中的该数据是独一无二的,不能有重复的,不能为空等。
而对于主键来说,一般都是整数类型。
那么为什么需要主键,我们现在没有外键的概念,我们纯拿班级举例,一个老师进班级,谁都不认识,只能通过学号点名,你说,两人的学号一样的话,点一个学号,站起来两人给老师回答问题,这不乱了吗?
所以现在我们可以简单的认为,主键就是标识数据的唯一性的,既然是唯一的,你能为空吗?肯定不能,所以我们创建了主键就默认该数据不能为空了,我们可以试试:
mysql> create table test_pri(
-> id int primary key,
-> age int
-> );
然后我们在desc一下:
可以看到对于该表的描述上,key的一列多了一个PRI,也就是主键的意思,对于NULL一列来说,也是自动设置为了NO。
那么我们试着照错误方向插入试试:
我们只插入age,这个时候提示没有默认值,也就是因为没有默认值,导致主键的非空属性给我们报错了,那么我们试着验证唯一性:
这次的报错就是Duplicate,也就是重复的意思,代表唯一性受到冲突了。
所以主键的非空和唯一性我们都验证了,进入下一个了吗?
那肯定不会,如果只验证这两个特点,那这主键就太low了,你说,我们标识唯一性,难道只能用一个字段来标识吗?
当然不是,所以我们可以用两个,或者三个字段来标识:
mysql> create table test_pri_2(
-> id int,
-> age int,
-> primary key(id,age),
-> address char(20)
-> );
这样使用就是主键后面加任意字段即可,演示就不演示了,和上面的没有什么两样。
mysql> create table test_pri_3( id int, primary key(id,age), address char(20), age int );
这里也是没有所谓的声明顺序而言的。
那么我们有了主键之后,我们应该如何删除主键呢?或者我们忘记添加主键了,我们应该如何添加呢?
对于删除主键来说,和删除数据库,删除表是一样的,直接drop:
mysql> alter table test_pri_3 drop primary key;
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
添加同理:
mysql> alter table test_pri_3 add primary key(id);
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0
到这里,我们主键的基本操作有点火候了。
接着我们可以进入下一个,即unique,唯一键。
唯一键,从字面意思来看,就是唯一性的意思,那好像有点不对,主键好像也是唯一性,那唯一键这一来不就有点累赘了嘛?实则不然,你想,主键的唯一性是用来保证该字段在表中的特殊性,即一种标志,而唯一键更多的是保证业务中的不可重复性,比如一个班级,学号是硬通货,点名的时候,通报的时候我们都可以使用学号,这是因为这个场景我们使用学号最好,那你说每个学生的家庭地址都不一样,你说我们能在点名的时候,通报的时候说地址吗?显然不行。
所以主键更多的是基于唯一性的同时保证一个特殊性,唯一键只是为了保证在业务处理的时候不会出现重复,保证一个正确性。
那么对于唯一键来说,是可以为空的,空字段不做唯一性比较。
以下是唯一键的演示:
create table if not exists test_unique( id int unique, age int primary key );
通过desc我们可以看到唯一键的unique的Key也增加了UNI的标志,代表这是唯一键,那么我们就来测试一下唯一键的雷点:
其实测试的点也只有一个,就是唯一这个点。
对于唯一键来说,也是可以删除和添加的,和主键也差不多,也是存在复合唯一键的,所以除了使用的点不同,键的特性还是差不了太多的:
接下来就是自增长了,这个非常简单,可以理解为自动++:
create table test_incre( age int unique auto_increment );
不过这个例子并不是一个好的例子,因为自增长一般是搭配主键使用的,你要说搭配唯一键的话,也能使,但是好像不是太好:
mysql> create table tt21( id int unsigned primary key auto_increment,
name varchar(10) not null default '' );
对于自增长来说,一个表只能有一个自增长,并且只能使整数,而且还要是索引,并且自增长的时候,如果我们指定自增长的话,下一个增长的是从最后一个元素开始增长。
我们也可以调用函数last_insert_id查看最后一个自增长的值是多少。
对于最后一个点来说的话,外键,foreign key,我们拿一个学号来说,每个班都有学生,学生都有学号,年龄,家庭住址等,我们可以根据这几个选项创建一个表,但是班级也有不同的班级号吧?所以我们根据班级的属性创建一个表,并且在添加学生表信息的时候,根据id我们可以确定该学生是哪个班级的,那么我们就将该学生的属性和班级表联系在了一起:
create table myclass (
id int primary key,
name varchar(30) not null comment'班级名'
);
首先我们创建一个主表,然后创建一个从表,在从表里指定外键约束:
create table stu (
id int primary key,
name varchar(30) not null comment '学生名',
class_id int,
foreign key (class_id) references myclass(id)
);
当我们往从表里面插入数据的时候,发现主键没有这个值,那么就报错了,同学们试试~
以上就是关于约束的基本内容。
感谢阅读!