首页 > 数据库 >MySQL数据库基础3

MySQL数据库基础3

时间:2022-11-24 16:15:05浏览次数:41  
标签:insert name int 数据库 基础 MySQL into 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);
insert into t1(name) values('jason');
insert into t1(name,id) values('kevin', 2);
所有字段类型在不加约束条件的情况下默认都可以为空


'''加上约束条件'''
create table t2(
	id int,
	name varchar(16) not null
);

insert into t2(id) values(1);
insert into t2(name) values('jason');
insert into t2 values(1,'');
insert into t2 values(2,null);  # 会报错 null关键字就表示空

默认值

create table t3(
	id int default 666,
	name varchar(16) default '匿名'
);

insert into t3(id) values(1);
insert into t3(name) values('jason');
insert into t3 values(2,'kevin');

唯一值

'''单列唯一'''
create table t4(
	id int unique,
	name varchar(32) unique
);
insert into t4 values(1,'jason'),(2,'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);  # 报错 

主键

1.单从约束层面上而言主键相当于not null + unique(非空且唯一)
create table t6(
	id int primary key,
	name varchar(32)
);

insert into t6(name) values('jason');
insert into t6 values(1,'kevin');
insert into t6 values(1,'jerry');  # 报错 数据与主键重复
2.InnoDB存储引擎规定了所有的表都必须有且只有一个主键(主键是组织数据的重要条件并且主键可以加快数据的查询速度)
'''
	当表中没有主键也没有其他非空且唯一的字段的情况下InnoDB会采用一个隐藏的字段作为表的主键 隐藏意味着无法使用 基于该表的数据查询只能一行行查找 速度慢
	当表中没有主键但是有其他非空且唯一的字段 那么会从上往下将第一个该字段自动升级为主键
'''
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"(编号)字段
'''

自增

该约束条件不能单独出现 并且一张表中只能出现一次 主要是配合主键一起用

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

insert into t8 values(1,'jason');  # 需要传id

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

insert into t9(name) values('kevin');  # 无需传id 会自增

'''
自增特性
	自增不会因为数据的删除而回退 永远自增往前
	如果自己设置了更大的数 则之后按照更大的数往前自增

	如果想重置某张表的主键值 可以使用
	truncate t9;  清空表数据并重置主键
'''

外键前戏

假设需要一张员工表
	id		name		age			dep_name		dep_desc

1.表的语义不明确(到底是员工还是部门)		无所谓
2.存取数据过于冗余(浪费存储空间)    		 无所谓
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,
	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 dep1(id)
	on update 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 update cascade
	on delete ascade,
	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
);

标签:insert,name,int,数据库,基础,MySQL,into,table,id
From: https://www.cnblogs.com/lzjjjj/p/16922198.html

相关文章

  • MySQL数据库管理
    一、MySQL数据库管理1.1库和表库是由一个个相互联系的二维表组成的表是由一行行记录和一列列的字段组成的行(记录):用来描述一个对象的信息列(字段):用来描述对象的一个属......
  • hive和mysql的笔记-反向overwrite,避免重复插入数据,量表关联更新
    hive和mysql的笔记-反向overwrite,避免重复插入数据,量表关联更新1反向overwrite操作->解决错误的插入数据的问题。描述:​ 例如​ 学生表:student<id,name,createtime......
  • MySQL---InnoDB数据存储结构(区_段_碎片区_表空间)
    区_段_碎片区为什么要有区?为什么要有段?为什么要有碎片区?区的分类 表空间 独立表空间系统表空间......
  • 总结我的 MySQL 学习历程,给有需要的人看
    作者|慕课网精英讲师马听你好,我是马听,现在是某零售公司的MySQLDBA,身处一线的我表示有很多话要讲。我的MySQL学习历程在我大三的时候,就开始接触到MySQL了,当时我也是从......
  • mysql的配置文件和逻辑架构
    二进制日志log-bin——主从复制——log-bin=mysql-bin错误日志log-error——默认是关闭的,记录严重的警告和错误信息,每次启动和关闭的详细信息等。——log-error=var/log/m......
  • mysql 表字段约束条件
    目录无符号、零填充非空默认值唯一值主键自增外键前戏关系的判断一对多的关系外键字段的建立多对多关系一对一关系无符号、零填充unsigned idintunsignedzerofill i......
  • MySQL数据库管理
    一、MySQL数据库管理1、库和表行(记录):用来描述一个对象的信息列(字段):用来描述对象的一个属性2、常用的数据类型int:整型float:单精度浮点4字节32位double:双精度浮点......
  • [MySQL] 报错 SELECT list is not in GROUP BY clause and contains nonaggregated co
    报错Expression#1ofSELECTlistisnotinGROUPBYclauseandcontainsnonaggregatedcolumn'XXX'whichisnotfunctionallydependentoncolumnsinGROUPBY......
  • 浅谈mysql高性能调优(一)
    mysql的问题介绍(一)mysql索引的实现原理和数据结构mysql索引设计的技巧mysql聚簇索引和非聚簇索引的区别mysql索引的中级调优方案mysql分布式集群的设计原则mysql如何实现高......
  • lightdb开启mysql兼容模式
    首先,从www.hs.net/lightdb下载最新版本并在安装时选择oracle模式,如下:  http://www.light-pg.com/docs/LightDB_Install_Manual/13.8-22.3/install.html#guilight......