目录
1. 空属性 NULL
2. 默认值 DEFAULT
3. 列描述comment
4. zerofill
5. 主键 PRIMARY KEY
6. 自增长AUTO_INCREMENT
7. 唯一键UNIQUE
8. 外键
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。
表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary key,
auto_increment,unique key 。
1. 空属性 NULL
两个值:null 和 not null -> 为空或不为空
数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没法参与运算。
create table student (
name varchar(20) not null,
class varchar(10) not null
);
如果设置为null,那么在插入数据的时候,必须有数据插入。
2. 默认值 DEFAULT
默认值:某一种数据可能会经常的出现某个具体的数据,可以在一开始就制定好,在需要真实数据的时候在进行修改,用户可以选择性的使用默认值。
比如:在女子学院里面,可以将性别这一个属性默认设置为女。
create table test_default (
name varchar(20) default '张三'
); // 创建一个表
insert into test_default values(); // 插入数据,但是不指定任何值
select * from test_default; // 查询表中的数据
默认值的生效,数据插入的时候不给该字段赋值,就使用默认值。
insert into test_default values('lisi');
select * from test_default
只有设置了default的列,才可以在插入值的时候,对列进行省略
--注意:not null和defalut一般不需要同时出现,因为default本身有默认值,不会为空
3. 列描述comment
列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。
create table test_comment (
name varchar(20) not null comment '姓名',
sex char(2) default '女' comment '性别'
);
通过desc查看不到注释信息。
desc test_comment;
通过show可以看到
show create table test_comment
4. zerofill
刚开始学习数据库时,很多人对数字类型后面的长度很迷茫。
create table test_zerofill (
age int(10)
)
show create table test_zerofill;
这里面的int(10)代表什么意思?整形int不应该是4字节吗?这个10代表什么?其实没有zerofill这个属性,括号内的数据时毫无意义的。
现在插入一条数据,
insert into test_zerofill values(5);
select * from test_zerofill;
现在将age列添加上zerofill字段。
alter table test_zerofill change age age int(5) zerofill;
select * from test_zerofill;
这次可以看到5变成了0……5,这就是zerofill属性的作用,如果宽度小于设定的宽度,自动填充0.要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。
5. 主键 PRIMARY KEY
主键:PRIMARY KEY用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。
create table test_primary (
id int not null primary key,
name varchar(20) not null
);
desc test_primary;
主键约束:主键对应的字段中不能重复,一旦重复,操作失败。
insert into test_primary values(1, 'a'), (1, 'b');
当表创建好以后但是没有主键的时候,可以再次追加主键。
alter table table_name add primary key(字段列表)
删除主键
alter table table_name drop primary key;
复合主键
在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键。
create table test_1 (
id int,
name varchar(20),
score tinyint,
primary key(id, name)
);
desc test_1;
6. 自增长AUTO_INCREMENT
AUTO_INCREMENT:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值 + 1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点:
- 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
- 自增长字段必须是整数
- 一张表最多只能有一个自增长。
create table test_auto (
id int unsigned primary key auto_increment,
name varchar (10) not null default ''
);
insert into test_auto(name) values('a');
insert into test_auto(name) values('b');
select * from test_auto;
。
索引:
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。
7. 唯一键UNIQUE
一张表中有往往很多字段需要唯一性,数据不能重复,但是一张表中只有一个主键;唯一键就可以解决表中有多个字段需要唯一性约束问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空子段不做唯一性比较。
关于唯一键和主键的区别:
主键更多的是标识唯一性,唯一键更多的是保证在业务上,不要和别的信息出现重复。
create table test_unique (
id char(10) unique,
name varchar(10)
);
插入第一条数据
insert into test_unique values('01', 'a');
插入第二条数据,id的值和第一条数据的id值一样
insert into test_unique values('01', 'b');
插入第三条数据,id值为空
insert into test_unique values('', 'b');
查询
select * from test_unique;
8. 外键
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null
foreign key (字段名) references 主表(列)
create table myclass (
id int primary key,
name varchar(30) not null
);
create table stu (
id int primary key,
name varchar(30) not null,
class_id int,
foreign key (class_id) references myclass(id)
);
正常插入数据
insert into myclass values(10, 'C++大牛班'),(20, 'java大神班');
插入一个班级号为15的学生,因为没有这个班级,是不会插入成功的。
insert into stu values(102, 'aa', 15);