首页 > 数据库 >day41MySQL基础(3)

day41MySQL基础(3)

时间:2022-11-24 21:02:20浏览次数:41  
标签:day41MySQL name int create 基础 key table id

目录

无符号、零填充

unsigned
	id int unsigned
zerofill
	id int(5) zerofill

非空

create table t1(
	id int,
    name varchar(16)
);
insert into t1(id) values(1);  # 只能id 添加数据  name 不添加数据
insert into t1(name) values('jason');
# 只添加name  不添加id
insert into t1(name,id) values('kevin',2);
# 不按照位置顺序传
insert into t1 values(null,null); # 没啥意义的操作 传两个空的

ps:所有字段类型不加约束条件的情况下都可以默认为空
    
create table t2(
	id int,
    name varchar(16) not null   # 名字不能为空
); 
insert into t2(id) values(1);
# 报错 name字段不能为空
insert into t2(name) values('jason'); # 正确  id 字段没有设置不能为空
insert into t2 values(1,''); # 正确 不管给了什么 都算有值  null 不行

默认值

create table t3(
	id int default 666,
    name varchar(16) default '匿名'
);
insert into t3(id) values(1); 
# id:1 name:匿名
insert into t3(name) values('jason');
# id:666 name:jason
insert into t3 values(2,'kevin');
# 和函数一样 有指定参数 变成指定参数

唯一值

'''单列唯一'''
create table t4(
	id int,
    name varchar(32) unique
);
insert into t4 values(1,'jason'),(2,'jason');
#  Duplicate entry 'jason' for key 'name'  只能有唯一jason

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

insert into t5 values(4,'127.0.0.1',8080);
# 报错 ip+port 组合是唯一

主键

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


create table t6(
    	id int primary key,
        name varchar(32)
    );
insert into t6(name) values('jason');
#  Field 'id' doesn't have a default value Field : 字段  字段没有默认值
insert into t6 values(1,'kevin');
insert into t6 values(1,'jerry'); # 报错

2.InnoDB存储引擎规定了所有的表都必须有且只有一个主键
	 
 主键是组织数据的重要条件并且主键可以加快数据的查询速度

  1.当表中没有主键 也没有其他非空且唯一的字段情况下
      InnoDB会采用一个隐藏的字段作为表的主键 
 '''隐藏意味着无法使用 基于该表的数据查询只能一行行查询 速度很慢'''
   2.当表中没有主键但是有其他非空且唯一的字段 那么会从上往下将第一个该字段自动升级为主键
    create table t7(
    	id int,
        age int not null unique,
        phone bigint not null unique,
        birth int not null unique,
        height int not null unique
    );
        
'''
我们再创建表的时候应该有一个字段用来标识数据的唯一性 并且该字段通常情况下就是 id(编号)字段
	id nid sid pid gid uid 

create table userinfo(
	uid int primary key,
)
'''   

自增

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

create table t9(
	id int primary key auto_increment,
    name varchar(32)
);


'''
自增特性
	自增不会因为数据的删除而回退 永远自增往前
	如果自己设置了更大的数 则之后按照更大的往前自增
	
	如果想充值某表的主键值 可以使用
	truncate t9; 清空表数据并充值主键
'''

外键前戏

制作一个员工表
 id    name     age    dep_name  dep_desc
    
 1.表寓意不明确(主体不清晰 到底是员工还是部门) 
 2.存储数据过于冗(rong)余(浪费存储空间)
 3.数据的扩展性极差

将上述表一分为二
	id     name      age
    
    
    id    dep_name   dep_desc
 上述的三个问题全部解决  但是员工跟不问之间没有了关系


外键字段:用于标识数据与数据之间关系的字段

关系的判断

表关系、数据关系其实意思是一样的 知识说法上有区别

关系总共有四种
	一对多
    多对多
    一对一
    没有关系

    关系的判断可以采用'换位思考'原则

一对多关系

以员工表和部门为例
	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,
    dop_name varchar(32),
    dop_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 dep1(id)
    on upadate cascade
    on delete cascade
);

create table dep1(
	id int primary key auto_increment,
    dep_name varchar(32),
    dep_desc varchar(64)
);


"""
外键其实是强耦合 不符合解耦合的特性
	所以很多时候 实际项目中当表较多的情况 我们可能不会使用外键 而是使用代码建立逻辑层面的关系 
"""

多对多关系

以书籍表与作者表为例
	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 book2author(
	id int primary key auto_increment,
    author_id int,
    foreign key(author_id) references author(id)
    on updata cascade
    on delete cascade
	book_id int,
  	foreign key(book_id) references book(id)
  	on update cascade
  	on delete cascade
);

一对一关系

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

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

标签:day41MySQL,name,int,create,基础,key,table,id
From: https://www.cnblogs.com/wei0919/p/16923286.html

相关文章

  • VRP基础
    1.概述VersatileRoutingPlatform,通用路由平台可以运行在多种硬件平台之上。拥有一致的网络界面、用户界面和管理界面,提供了灵活丰富的应用解决方案。集成了路由交换......
  • python入门基础之主键、外键、约束条件
    python入门基础之主键、外键、约束条件目录python入门基础之主键、外键、约束条件字段约束条件主键自增外键前戏关系的判断外键字段的建立多对多关系一对一关系字段约束......
  • PHP基础学习
    PHP基础学习在php中,.表示字符串连接符echo"1111111111"."2222222222"."333333333<br/>";print"1111111111"."2222222222"."333333333<br/>";......
  • linux基础 | 基础介绍、目录、操作系统命令、用户管理、常用指令
    1、Linux目录知识Linux在根目录下有很多目录都是规定好的,比如etc里面是配置信息,boot是启动时用到的文件Linux会把计算机的硬件映射成一个文件来管理在Linux里面一切皆是......
  • 机器学习 数学基础 学习笔记 (5)常见统计量
    1.期望离散型随机变量的一切可能的取值xi与对应的概率Pi(=xi)之积的和称为该离散型随机变量的数学期望(设级数绝对收敛),记为E(x)。随机变量最基本的数学特征之一。它反映随机......
  • java基础笔记
    一、泛型受限1、类型通配符上限:类/接口<?extends实参类型>要求该泛型的类型只能是实参类型,或者实参类型的子类类型 2、类型通配符下限:类/接口<?extends实参类型>要......
  • java基础——二维数组基本概念
    之前我们已经知道什么是数组(一维数组)java基础——数组,数组的存取 这里补充一点: 数组本身是引用数据类型,数组的元素 可以是  基本数据类型 跟 引用数据类型 ......
  • 全栈基础开发框架:XQFramework
    引言在疫情的影响下,软件行业的寒冬不知何时才到尽头,在这荆棘坎坷的道路上,软件人员或许会慢慢的向全栈开发进行转变,在此之前本身也从事着全栈开发工作,随着项目不断增加,开发......
  • android学习布局管理器的一些心得——基础篇
    LinearLayout---线性布局   在LinearLayout中,如下方法是比较容易忘记的,而且这些方法是LinearLayout常用的方法:1.android:gravity(在代码编程实现中的方法为:setGravit......
  • android学习布局管理器的一些心得2——基础篇
    RelativeLayout-----相对布局1.RelativeLayout不是相对于单体的布局,每一个组件的布局都要依赖另外一个或多个组件,这个布局表示的是一个组件相对于另一个组件(或者是整个Rel......