文章目录
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业 务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。
1. 空属性 null/not null
- 两个值:null(默认的)和not null(不为空)
- 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。
- 如果某个字段设置了约束字段not null的时候,插入数据的时候必须给值,不然会出错。
2. 默认值 default
- 某一数据据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选 择性的使用默认值。
- 如果在插入的时候不给该字段赋值,就是用默认值。
.........
sex char(2) default '男'
);
3. 列描述 comment
name varchar(20) not null comment ’姓名‘,
- 通过desc看不到注释信息
- 通过show可以看到
show create table test1;
4. zerofill
如果宽度小于设定的宽度,自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是原来的值。
create table tt7(
a int(5) unsigned zerofill
);
insert into tt7 values(1);
insert into tt7 values(12);
select * from tt7;
5. 主键 primary key
5.1 单字段主键
primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。
create table tt8 (
id int unsigned primary key comment '学号不能为空',
name varchar(20) not null
);
desc tt8;
- 如果有多个字段作为主 键,可以使用复合主键:在所有字段之后,使用primary key(主键字段列表)来创建主键
create table tt9(
id int unsigned,
course char(10) comment '课程代码',
score tinyint unsigned default 60 comment '成绩',
primary key(id, course) -- id和course为复合主键
);
- 当表创建好以后,可以再次追加主键
alter table 表名 add primary key(字段列表)
- 主键约束:主键对应的字段中不能重复,一旦重复,操作失败。
- 删除主键
alter table 表名 drop primary key;
5.2 多字段联合主键
定义一个员工表emploee1,假设表中没有主键id,为了唯一确定一个员工,可以把name、deptID联合起来作为主键,SQL语句如下:
create table emploee1(
name varchar(25),
deptID int(11),
salary float,
priamry key(name, deptID)
);
       在执行完这个语句之后,在数据库中便创建了一个名为emploee1的表,并且name字段和deptID字段组合在一起成为该数据表的多字段联合主键。
6. 自增长 auto_increment
auto_increment:当对应的字段,不给值,系统会从当前字段已经有的最大值+1操作,得到一个新的不同的值,通常和主键搭配使用,作为逻辑主键。
- 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
- 自增长字段必须是整数
- 一张表最多只能有一个自增长
- 该字段必须是主键的一部分
- 不能设置默认值
create table tt10(
id int unsigned primary key auto_increment,
name varchar(10) not null default ''
);
insert into tt10(name) values('a');
insert into tt10(name) values('b');
在插入后获取上次插入的 AUTO_INCREMENT 的值(批量插入获取的是第一个值)
select lsat_insert_id();
- 索引
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表 中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目 录,可以根据目录中的页码快速找到所需的内容。
索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引 以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表 中的特定信息。
7. 唯一键 unique
一张表中往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
create table student (
id char(10) unique comment '学号,不能重复,但可以为空',
name varchar(10)
);
insert into student(id, name) values('01', 'aaa');
insert into student(id, name) values('01', 'bbb'); --唯一约束不能重复
insert into student(id, name) values(null, 'bbb'); -- 但可以为空
8. 外键
外键用来在两个表之间建立连接,它可以是一列或者多列。一个表可以有一个或者多个外键。外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null,用于外键的字段要保证两张表类型一致,不允许删除在另一个表中具有关联关系的列(主表,从表均不可)。
foreign key (字段名) referrences 主表(列)
- 先创建主键表
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)
);
- 正常插入数据
insert into myclass values(10, 'C++大牛班'),(20, 'java大神班');
insert into stu values(100, '张三', 10),(101, '李四',20);
- 在stu表中插入一个班级号为30的学生,因为在主表中没有这个班级,所以插入失败。
insert into stu values(102, 'wangwu',30);
- 插入班级id为null的学生,新来的,还没有分配班级。
insert into stu values(103,'赵六',null);