MySQL数据库——字段约束条件

管理员

MySQL数据库——字段约束条件

一、无符号、零填充

1、unsigned(无符号)
	id int unsigned
2、zerofill
	id int(5) zerofill

二、非空

'''
设置非空 not null  
所有字段类型在不加约束条件的情况下默认都可以为空
'''
create table t1(
	id int,
    name varchar(16) not null
);
insert into t1(id) values(1);
insert into t1(name) values('maria');
insert into t1(name,id) values('ben',2);

三、默认值

create table t2(
	id int default 888,
    name varchar(16) default '匿名'
);
insert into t2(id) values(1);
insert into t2(name) values('maria');
insert into t2 values(2,'ben');

四、唯一值

'''
单列唯一
'''
create table t3(
	id int unique,
    name varchar(32) unique
);
insert into t3 values(1,'maria'),(2,'ben');

'''
联合唯一
'''
create table t4(
	id int,
    ip varchar(32),
    port int,
    unique(ip,port)
)
insert into t4 values(1,'127.0.0.1',8080),
(2,'127.0.0.2',8080),(3,'127.0.0.1',8080);
insert into t4 values(4,'127.0.0.1',8080);

五、主键

'''
单从约束层面上而言,主键相当于not null + unique(非空且唯一)
'''

create table t5(
	id int primary key,
    name varchar(32)
);
insert into t5(name) values('maria');
insert into t5 values(1,'ben');
insert into t5 values(1.'david');
'''
	InnoDB存储引擎规定了所有的表都必须有且只有一个主键(主键是组织数据的重要条件,并且主键可以加快数据的查询速度)
	当表中没有主键也没有其他非空且唯一的字段是:
	InnoDB会采用一个隐藏的字段作为表的主键,这个主键无法使用,查询数据时会基于该表的数据一行行的查询,速度很慢
	当表中没有主键但是又其他非空且唯一的字段,那么会从上而下将第一个该字段自动升级为主键
'''
create table t6(
	id int,
    age int not null unique,
    phone bigint not null unique,
    birth int not null unique,
    height int not null unique
);
'''
我们在创建表的时候,应该有一个字段用来表示数据的唯一性,并且该字段通常情况下就是‘id’编号字段
'''
create table user_info(
	uid int primary key,
);

六、自增

'''
	该约束条件不能单独出现,并且一张表中只能出现一次,主要就是配合主键一起使用
'''
create table t7(
	id int primary key,
    name varchar(32)
);

create table t8(
	id int primary key auto_increment,
    name varchar(32)
);
'''
自增的特性:
	自增不会因为数据的删除而回退,而是接着之前的数值继续自增,如果设置了更大的数,则按照最大的那个数继续自增
	如果想要充值某张表的主键值,可以使用关键字
	truncate 表名;
	清空表数据并重置主键
'''
truncate t7;

七、外键

1、外键前戏

'''
为什么需要外键:
	如果所有的数据都在同一个表内:
	1、表名的语义不明确
	2、存取数据过于冗余
	3、数据的拓展性极差
使用将一张大表拆分为两个或多个表,并用外键连接,即可避免上述问题

外键:
	用于表示表内数据与数据之间的关系
'''

2、关系的判断

'''
表关系:
	一对多
	多对多
	一对一
	无关系
'''

2.1一对多关系

'''
以员工表和部门表为例
	1.先站在员工表的角度
    	问:一名员工能否对应多个部门
       答:不可以
 	2.再站在部门表的角度
    	问:一个部门能否对应多名员工
     	答:可以	
	结论:一个可以一个不可以 那么关系就是'一对多'
	针对'一对多'关系 外键字段建在'多'的一方

小技巧:
	先定义出含有普通字段的表 之后再考虑外键字段的添加
'''
create table emp(
	id int primary key auto_increment,
    name varchar(32),
    age int,
    dep_id int,
    foreign key(dep_id) references dep(id)
);

create table dep(
	id int primary key auto_increment,
    dep_name varchar(32),
    dep_desc varchar(64)
);
'''
1、创建表的时候一定要先创建被关联表
2、录入表数据的是偶一定要先录入被关联表
3、修改数据的时候外键字段无法修改和删除
针对3有简化措施>>>:级联更新、级联删除
'''
create table emp1(
	id int primary key auto_increment,
    name varchar(32),
    age int,
    dep_id int,
    foreign key(dep_id) references dep2(id)
    on update cascade
    on delete cascade
);
create table dep1(
	id int primary key auto_increment,
    dep_name varchar(32),
    dep_dasc varchar(64)
);
'''
外键是强耦合,不符合戒耦合的特性
所以很多时候 实际项目中当表较多的情况 
我们可能不会使用外键 
而是使用代码建立逻辑层面的关系
'''

2.2 多对多关系

 '''
 以书籍表与作者表为例
	1.先站在书籍表的角度
  		问:一本书能否对应多个作者
      答:可以
 	2.再站在作者表的角度
    	问:一个作者能否对应多本书
      	答:可以
   结论:两个都可以 关系就是'多对多'	
 	针对'多对多'不能在表中直接创建 需要新建第三张关系表
 '''
 create table book(
 	id int primary key auto_increment,
     title varchar(32),
     price float(5,2)
 );
 create table author(
 	id int primary key auto_increment,
     name varchar(32),
     phone bigint
 );
 create table book_author(
 	id int primary key auto_increment,
     author_id int,
     foreign key(author_id) references author(id)
     on update cascade
     on delete cascade,
     book_id int,
     foreign key(book_id) references book(id)
     on update cascade
     on delete cascade
 );

2.3 一对一关系

'''
以用户表与用户详情表为例
	1.先站在用户表的角度
  		问:一个用户能否对应多个用户详情
      答:不可以
 	2.再站在用户详情表的角度
    	问:一个用户详情能否对应多个用户
      	答:不可以
   结论:两个都可以 关系就是'一对一'或者没有关系	
 	针对'一对一'外键字段建在任何一方都可以 但是推荐建在查询频率较高的表中
'''
create table user(
	id int primary key auto_increment,
    name varchar(32),
    detail_id in unique,
    foreign key(detail_id) references user_detail(id)
    on update cascade
    on delete cascade
);

create table user_detail(
	id int primary key auto_increment,
    phone bigint
);