由于数据类型对表的约束比较单一,所以我们需要一些额外的约束,更好的保证数据的合法性。 表的约束有很多,主要有:null/not null,default,comment,zerofill,primary key,auto_increment,unique key。
接下来,如果我们在插入数据的时候,没有给教室数据就会插入失败:
default:默认值就是某种数据经常都是一个具体的值,可以一开始就指定好,比如说,性别一开始设置为默认’男’,我们在插入数据的时候,即使没有给性别值,它也会默认出现性别’男’。 我们来试一下插入数据,不给某些字段赋值,看会出现什么结果:
mysql> insert into aa(name) values('张三'); Query OK, 1 row affected (0.00 sec)结果如下图所示,虽然我们没有给年龄和性别赋值,但它依然出现了一开始我们指定好的默认值。
列描述:comment,就是专门用来描述一个字段的,用来给程序员或者DBA进行解释的,通俗的说,就是假如某个程序猿英语不好,你创建表的时候他不知道你这一个字段代表什么意思,但是有了comment描述,他就可以轻而易举的明白这个字段的意思(其实跟我们写代码加的注释是一个道理)。
mysql> create table bb( -> name varchar(20) not null comment '姓名', -> age tinyint unsigned default 0 comment '年龄', -> sex char(2) default '男' comment '性别' -> ); Query OK, 0 rows affected (0.03 sec)通过desc看不到我们加的注释,通过show可以:
不知道大家有没有注意到,在创建表的时候,我们通常指定某字段数据类型为int(10),整型应该是4字节,这个10到底是什么呢?其实如果没有zerofill这个属性,括号里的数字是多少都没有意义。 下面这张图是创建表的时候没有加zerofill属性,看看显示结果如何: 这次我们加上zerofill属性,再观察一下结果,首先我们修改一下cc表的属性:
mysql> alter table cc change a a int(5) unsigned zerofill; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0结果与之前不同: 可以看到,a的值由原来的1变成了00001,这就是zerofill这个属性的作用,如果宽度小于设定的宽度,前面就会自动填充0。需要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1,这可以用hex函数来证明。
primary key:用来唯一约束该字段里的数据,不能重复,不能为空,一张表中最多只有一个主键,主键所在的列通常都是整数类型。
案例: 有两种方式指定主键: 1)直接在字段后面指定主键 mysql> create table dd( -> id int unsigned primary key comment '学号不能为空', -> name varchar(20) not null); Query OK, 0 rows affected (0.03 sec)表中key那一列的PRI就表示该字段是主键。 2)在所有字段之后,使用primary key创建主键(如果有多个字段作为主键,可以使用复合主键)
mysql> create table ee( -> id int unsigned, -> course char(10) comment '课程代码', -> score tinyint unsigned default 60 comment '成绩', -> primary key(id,course) -> ); Query OK, 0 rows affected (0.03 sec) 当表创建好后,可以再次追加主键 alter table 表名 add primary key(字段列表) 主键对应的字段不能重复,一旦重复,插入失败 删除主键 alter table 表名 drop primary key需要注意的是,如果一张表中有多个主键,用上面的语句删除后是删除了所有的主键。
auto_increment:当对应的字段没有给值时,系统会从当前字段中已有的最大值进行+1操作,通常和主键搭配使用,作为逻辑主键。
自增长特点:
任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)自增长字段必须是整数一张表最多只能有一个自增长 mysql> create table ff( -> id int unsigned primary key auto_increment, -> name varchar(10) not null default '' -> ); Query OK, 0 rows affected (0.03 sec) mysql> insert into ff(name) values('a'); Query OK, 1 row affected (0.01 sec) mysql> insert into ff(name) values('b'); Query OK, 1 row affected (0.00 sec)这里补充一个概念: 索引: 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构。索引的作用就相当于一本书的目录,我们可以根据目录中的页码快速找到所需的内容。 索引提供指向存储在表的指定列中的数据值的指针,然后根据我们指定的排序顺序对这些指针排序。数据库使用索引可以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行的更快,可以快速访问数据库表中的特定信息。
unique:一张表中往往会有很多字段需要唯一性,数据不能重复,但是一张表中只允许有一个主键,而唯一键就可以解决表有多个字段需要唯一性约束的问题。 唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
mysql> create table student( -> id char(10) unique comment '学号,不能重复,可以为空', -> name varchar(20) -> ); Query OK, 0 rows affected (0.03 sec) mysql> insert into student(id,name) values('01','aaa'); Query OK, 1 row affected (0.01 sec) mysql> insert into student(id,name) values('01','bbb'); ---唯一约束不能重复 ERROR 1062 (23000): Duplicate entry '01' for key 'id' mysql> insert into student(id,name) values(null,'bbb'); ---可以为空 Query OK, 1 row affected (0.00 sec)外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,而主表必须是有主键约束或者唯一键unique约束。当定义外键后,要求外键列的数据必须在主表的主键列存在或为空。 语法:
foreign key (字段名) references 主表(列)案例: 创建一个主表班级表:myclass
mysql> create table myclass( -> id int primary key, -> name varchar(30) not null comment '班级名' -> ); Query OK, 0 rows affected (0.03 sec)创建一个从表学生表:stu
mysql> create table stu( -> id int primary key, -> name varchar(30) not null comment '学生名', -> class_id int, -> foreign key (class_id) references myclass(id) -> ); Query OK, 0 rows affected (0.04 sec)现在我们就已经将stu表里的class_id和myclass表里的id形成了关联关系,即外键约束,接下来进行正常插入数据:
mysql> insert into myclass values(10,'c++'),(20,'java'); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into stu values(100,'张三',10),(101,'李四',20); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0如果我们再插入一个班级号为30的学生,而因为不存在这个班,所以无法成功插入: 而插入一个班级id为null则可以插入成功,比如新来了一个学生,目前还没有分配班级:
mysql> insert into stu values(102,'王五',null); Query OK, 1 row affected (0.00 sec)