搜索

MySQL数据库


发布时间: 2022-11-24 19:59:01    浏览次数:35 次

MySQL

数据存取方式的演变

1.文本文件
文件路径不固定:C:\aaa.txt D:\bbb.txt E:\ccc.txt
数据格式不统一:jason|123 jason$123 jason 123

2.软件开发目录规范
规定了数据应该保存在db目录下>>>:路径偏向统一
db/user.txt db/userinfo.txt db/jason.json db/jason
数据格式还是没有得到统一
文本:json格式 对象

3.数据库服务⭐
统一路径,统一操作方式
降低学习成本,提高开发效率

数据库软件应用演变

1.单机游戏
数据存储于各个计算机的本地,无法共享
2.网络游戏
数据存储于网络中,可以共享(数据库服务)

数据库服务集群:提升数据的安全性
数据库集群,顾名思义,就是利用至少两台或者多台数据库服务器,构成一个虚拟单一数据库逻辑映像,像单数据库系统那样,向客户端提供透明的数据服务

数据库的本质

站在底层原理的角度:
数据库指的是操作数据的进程(一堆代码)
站在实际应用的角度:
数据库指的是可视化操作界面(一些软件)

ps:不做特殊说明的情况下讲数据库其实指的是数据库软件

数据库软件本质也是CS架构的程序
意味着所有的程序员其实都有资格编写一款数据库软件

数据库分类

〓关系型数据库介绍〓

1、关系型数据库的由来

虽然网状数据库和层次数据库已经很好的解决了数据的集中和共享问题,但是在数据库独立性和抽象级别上扔有很大欠缺。用户在对这两种数据库进行存取时,仍然需要明确数据的存储结构,指出存取路径。而关系型数据库就可以较好的解决这些问题。

2、关系型数据库介绍

关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上,通过对这些关联的表格分类、合并、连接或选取等运算来实现数据库的管理。

特征1:拥有固定的表结构(字段名,字段类型)

特征2:数据之间可以建立数据库层面关系

关系型数据库诞生40多年了,从理论产生发展到现实产品,例如:Oracle和MySQL,Oracle在数据库领域上升到霸主地位,形成每年高达数百亿美元的庞大产业市场。

3、关系型数据库表格之间的关系举例

关系型数据库举例:

MySQL、Oracle、MariaDB、PostgreSQL、sql server、sqlite、db2、access

〓非关系型数据库介绍〓

1、非关系型数据库诞生背景

NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSql数据库在特定的场景下可以发挥出难以想象的高效率和高性能,它是作为对传统关系型数据库的一个有效的补充。

NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。

特征1:没有固定的表结构,数据存储采用K:V键值对的形式
{'name':'jason'}
{'username':'kevin','pwd':123}
特征2:数据之间无法建立数据库层面的关系
可以自己编写代码建立逻辑层面的关系

2、非关系型数据库种类

(1)键值存储数据库(key-value)

键值数据库就类似传统语言中使用的哈希表。可以通过key来添加、查询或者删除数据库,因为使用key主键访问,所以会获得很高的性能及扩展性。

键值数据库主要使用一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署、高并发。

典型产品:Memcached、Redis(目前最火,使用频率最高的非关系型数据库(缓存数据库),虽然缓存数据库是基于内存做数据存取但是拥有持久化的功能)、MemcacheDB

(2)列存储(Column-oriented)数据库

列存储数据库将数据存储在列族中,一个列族存储经常被一起查询的相关数据,比如人类,我们经常会查询某个人的姓名和年龄,而不是薪资。这种情况下姓名和年龄会被放到一个列族中,薪资会被放到另一个列族中。

这种数据库通常用来应对分布式存储海量数据。

典型产品:Cassandra、HBase

(3)面向文档(Document-Oriented)数据库

文档型数据库的灵感是来自于Lotus Notes办公软件,而且它同第一种键值数据库类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。

面向文档数据库会将数据以文档形式存储。每个文档都是自包含的数据单元,是一系列数据项的集合。每个数据项都有一个名词与对应值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或JSONB等多种形式存储。

典型产品:MongoDB(最像关系型数据库的非关系型数据库)、CouchDB

(4)图形数据库

图形数据库允许我们将数据以图的方式存储。实体会被作为顶点,而实体之间的关系则会被作为边。比如我们有三个实体,Steve Jobs、Apple和Next,则会有两个“Founded by”的边将Apple和Next连接到Steve Jobs。

典型产品:Neo4J、InforGrid

虽然数据库软件有很多,但是操作方式相差不多,学会了一个几乎就可以学会所有,其中以MySQL最为典型

MySQL简介

1.版本问题
8.0:最新版
5.7:使用频率较高
5.6:学习推荐使用
ps:站在开发的角度使用哪个版本学习都没有关系

2.下载流程

​ 1.访问官网
​ 2.点击DOWNLOADS并点击GPL
​ 3.点击community server
​ 4.点击Archives
​ 5.选择对应系统的对应版本下载(zip压缩包)

3.主要目录介绍
bin目录
存放启动文件
mysqld.exe(服务端)

​ mysql.exe(客户端)
​ data目录
​ 存放核心数据
​ my-default.ini
​ 默认的配置文件
​ readme
​ 软件说明

MySQL基本使用

cmd建议你使用管理员身份打开

1.切换到mysql的bin目录下先启动服务端
mysqld
2.保持窗口不关闭,重新打开一个新的cmd窗口
3.切换到mysql的bin目录下启动客户端
mysql
"""
直接使用mysql命令默认是游客模式,权限和功能都很少
mysql -u用户名 -p密码

管理员默认没有密码 连续回车即可
mysql -uroot -p

制作系统服务

1.先把bin目录添加到环境变量
清空之前打开的cmd窗口 一定要把之前用cmd启动的服务端关闭(ctrl+c)
2.将mysql添加到系统服务中
1.如何查看系统服务
鼠标右键任务栏选择服务
cmd输入services.msc回车
2.以管理员身份打开cmd窗口
mysqld --install
3.首次添加不会自动启动 需要人为操作一下
1.鼠标右键点击启动
2.命令行启动
net start mysql
"""
如果想卸载重新按照
1.先关闭服务端
net stop mysql
2.移除系统服务
mysqld --remove
"""

MySQL密码操作

1.修改密码
方式1:mysqladmin
mysqladmin -u用户名 -p原密码 password 新密码
方式2:直接修改存储用户数据的表
方式3:冷门操作 有些版本可能还不支持
set password=password('新密码'),修改当前登录用户的密码

2.忘记密码
方式1:卸载重新装
方式2:把data目录删除 拷贝同桌的目录
方式3:小把戏操作
1.关闭正常的服务端
2.以跳过授权表的方式重启服务端(不校验密码)
3.以管理员身份进入然后修改mysql.user表数据即可
net stop mysql
mysqld --skip-grant-table
mysql -uroot -p
update mysql.user set password=password('123') where Host='localhost' and User='root';
4.关闭服务端,然后以正常方式启动即可

SQL与NoSQL

数据库服务端是可以服务多种类型的客户端
客户端可以是自己开发的,也可以是python代码编写,也可以是java代码编写

SQL
操作关系型数据库的语言
NoSQL
操作非关系型数据库的语言
ps:要想跟数据库交互就必须使用数据库指定的语言

"""
SQL有时候也指代关系型数据库
NoSQL有时候也指代非关系型数据库
"""

数据库有关概念

"""
强调:为了方便的理解,采用以下方法类比学习,但是本质是是有区别的
"""
库 就相当于是 文件夹
表 就相当于是 文件夹里面的文件
记录 就相当于是 文件夹里面的文件中的一行行数据

验证
1.查看所有的库名称
show databases;
2.查看所有的表名称
show tables;
3.查看所有的记录
select * from mysql.user;

基本SQL语句

1.sql语句必须以分号结尾
2.sql语句编写错误之后不用担心,可以直接执行报错即可

'''基于库的增删改查'''

1.创建库
create database 库名;
2.查看库
show databases; 查看所有的库名称
show create database 库名; 查看指定库信息
3.编辑库
alter database 库名 charset='utf8';
4.删除库
drop database 库名;

'''基于表的增删改查'''

操作表之前需要先确定库
create database db1;
切换操作库
use db1;
1.创建表
create table 表名(字段名 字段类型,字段名 字段类型);
2.查看表
show tables; 查看库下所有的表名称
show create table 表名; 查看指定表信息
describe 表名; 查看表结构
desc 表名;
ps:如果想跨库操作其他表 只需要在表名前加库名即可
desc mysql.user;
3.编辑表
alter table 表名 rename 新表名;
4.删除表
drop table 表名;

'''基于记录的增删改查'''

1.插入数据
insert into 表名 values(数据值1,数据值2);
2.查询数据
select * from 表名; 查询表中所有的数据
3.编辑数据
update 表名 set 字段名=新数据 where 筛选条件;
4.删除数据
delete from 表名;
delete from 表名 where id=2;

字符编码与配置文件

查看MySQL相关信息的方法(\s)

在登陆进入MySQL之后使用

z8NQzt.png

在该页面可以看到MySQL的当前用户、版本、编码、端口号

MySQL5.6及之前的版本编码需要人为统一,之后的版本已经全部默认统一

如果想要永久修改编码配置,需要操作配置文件,在修改配置文件时不可以直接修改源文件
默认的配置文件是my-default.ini
拷贝上述文件并重命名为my.ini

将已经编写好的配置信息直接拷贝到我们复制的配置文件中

[mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4
[client]
    default-character-set=utf8mb4
[mysql]
    default-character-set=utf8mb4

[mysqld]修改服务端配置

修改了配置文件中关于[mysqld]的配置,需要重启服务端

[client]修改第三方客户端配置,也就是我们用代码编写的客户端

[mysql]修改mysql自带的客户端配置

1.utf8mb4能够存储表情
	功能更强大
2.utf8与utf-8是有区别的
	MySQL中只有utf8

我们还可以利用配置文件将用户名以及密码写在配置文件内,这样就可以实现再使用MySQL时不需要登录即可直接进入界面

[mysql]
	user='root'
	password=123

数据库存储引擎

存储引擎可以理解为在数据库中对数据存取采用的多种不同方式

MySQL中查看存储引擎最为常见的方法为登录后输入下列代码

show engines;

需要我们了解的四个存储引擎:

create database db2;
 	use db2;
	create table t1(id int) engine=innodb;
 	create table t2(id int) engine=myisam;
  	create table t3(id int) engine=memory;
 	create table t4(id int) engine=blackhole;

MyISAM

  MySQL5.5之前默认的存储引擎
  存取数据的速度快,但是功能较少,安全性较低

InnoDB

​ MySQL5.5之后默认的存储引擎
​ 支持事务、行锁、外键等操作,存取速度没有MyISAM快,但是安全性更高

Memory

​ 基于内存存取数据,仅用于临时表数据存取

BlackHole

​ 任何写入进去的数据都会立刻丢失

这四种引擎的存取数据的方式不同,他们各自生成标文件后的文件夹内容也不同

'''
	1.innodb两个文件
		.frm	表结构
		.ibd	表数据(表索引)
	2.myisam三个文件
		.frm	表结构
		.MYD	表数据
		.MYI	表索引
	3.memory一个文件
		.frm	表结构
	4.blackhole一个文件
		.frm	表结构
'''

PS:在MySQL中默认是不区分大小写的

创建表的完整语法

create table 表名(
	字段名 字段类型(数字) 约束条件,
	字段名 字段类型(数字) 约束条件,
 	字段名 字段类型(数字) 约束条件
);

PS:

1.字段名和字段类型是必须的
2.数字和约束条件是可选的
3.约束条件也可以写多个,空格隔开即可
4.最后一行结尾不能加逗号

MySQL常见字段类型

字段类型之整型

tinyint			1bytes	正负号(占1bit)
smallint		2bytes	正负号(占1bit)
int			    4bytes	正负号(占1bit)
bigint			8bytes	正负号(占1bit)

验证整型默认是否携带正负号

create table t5(id tinyint);
insert into t5 values(-129),(128);
select * from t5;

结果是-128和127,也就意味着MySQL的整型默认自带正负号

取消正负号的方式

create table t6(id tinyint unsigned);
insert into t6 values(-129),(128),(1000);
select * from t6;

⭐MySQL中的严格模式

当我们在使用数据库存储数据的时候,如果数据不符合规范,应该直接报错而不是擅自修改数据,这样会导致数据的失真(没有实际意义)

在这里没有报错的原因在于修改配置文件时,该设置被我们删除掉了

查看是否为严格模式

show variables like '%mode%';

修改严格模式的方法

临时修改

set session sql_mode='strict_trans_tables';
"只在当前客户端有效,客户端重启后失效"
set global sql_mode='strict_trans_tables';
"只在当前服务端有效,服务端重启后失效"

永久修改

在配置文件中修改,添加下列代码

sql_mode=STRICT_TRANS_TABLES 

⭐定义字段类型时括号中数字的意义

数字在很多地方都是用来表示限制存储数据的长度
但是在整型中数字却不是用来限制存储长度

create table t12(id int(3));  
"不是用来限制长度"
insert into t12 values(12345);
select * from t12;

create table t13(id int(5) zerofill); 
"而是用来控制展示的长度"
insert into t13 values(123),(123456789);
select * from t13;

字段类型之浮点型

MySQL中的三中浮点型的区别在于精度不同

float < double < decimal

float(20,10)
	'总共存储20位数 小数点后面占10'
double(20,10)
	'总共存储20位数 小数点后面占10'
decimal(20,10)
	'总共存储20位数 小数点后面占10'

精确度验证

create table t7(id float(60,20));
create table t8(id double(60,20));
create table t9(id decimal(60,20));
insert into t7 values(1.11111111111111111111);
insert into t8 values(1.11111111111111111111);
insert into t9 values(1.11111111111111111111);
select * from t7;
select * from t8;
select * from t9;

字段类型之字符类型

字符类型分为char与varchar两种

char
固定长度字符,简称定长
char(4) 最多存储四个字符,超出就报错,不够四个空格填充至四个

varchar
可变长度字符
varchar(4) 最多存储四个字符,超出就报错,不够则有几位存几位

create table t10(id int, name char(4));
create table t11(id int, name varchar(4));
insert into t10 values(1, 'ha');
insert into t11 values(1, 'ha');
select * from t10;
select * from t11;

在验证时我们使用char_length()获取字段存储的数据长度后,发现存入和取出来的数据长度一样,这是因为默认情况下MySQL针对char的存储会自动填充空格和删除空格

我们也可以对这个操作采取严格模式

set global sql_mode='strict_trans_tables,pad_char_to_full_length';

两种方式的优缺点

char
优势:整存整取,速度很快

劣势:浪费存储空间

varchar
优势:节省存储空间

劣势:存取数据的速度较char慢

varchar存取速度慢的原因:

char采用整存整取的方式,所以即使当所有数据是连在一起时,char也可以按照存入的数量进行切割,依旧可以获得原本的数据,但是对于varchar来讲,有多少数据存多少数据,但是当数据全部连在一起存放,想获取原本的数据就需要进行一些额外的操作,这个操作类似于我们在TCP中学到的报头,varchar会在数据的开头用类似报头的一段数据来划分数据,这样在存和取的时候就都需要先处理报头,降低了效率但是保障了数据安全

字段类型之枚举与集合

枚举enum

create table t15(
       id int,
       name varchar(32),
       gender enum('male','female','others')
    );
 	insert into t15 values(1,'tony','猛男');
  	insert into t15 values(2,'jason','male');
 	insert into t15 values(3,'kevin','others');

枚举的作用就是在定义表的时候,提供几个选项作为之后要添加数据的参考,添加数据时只能使用其中一个进行添加

集合set

create table t16(
       id int,
       name varchar(16),
       hobbies set('basketabll','football','doublecolorball')
    );
 	insert into t16 values(1,'jason','study');
 	insert into t16 values(2,'tony','doublecolorball');
	insert into t16 values(3,'kevin','doublecolorball,football');

集合的作用也是在定义表时提供几个选项作为添加数据时的参考,但是在添加数据时,可以选择其中的一个或多个进行添加

字段类型之日期类型

datetime 年月日时分秒
date 年月日
time 时分秒
year 年

create table t17(
	id int,
  	name varchar(32),
 	register_time datetime,
 	birthday date,
 	study_time time,
 	work_time year
 );
insert into t17 values(1,'jason','2000-11-11 11:11:11','1998-01-21','11:11:11','2000');
select * from t17;

在实际使用中,有关时间的字段一般由系统自动获取,不需要刻意的人为操作

字段约束条件

无符号(unsigned)及零填充(zerofill)

unsigned即取消数字的正负号

zerofill即在输入的数据不足位数时用0进行填充

unsigned
id int unsigned
zerofill
id int(5) zerofill

非空(not null)

not null也就是限定在变种添加记录时,经过处理的选项不可以为空,必须进行传值,所有字段类型不加约束条件的情况下默认都可以为空

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);
默认值(default)

default即在定义表的字段名时,可以将一些字段名设定默认的值,如果在添加记录时没有添加该字段名的值,那么展示表中数据时会以默认值展示

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');
唯一值(unique)

单列唯一,只在一列数据中添加唯一属性,该列数据中不允许出现重复数据,其他列的数据依旧保持原样

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);
主键(primary key)

primary key的作用在于加快数据查询速度,单从约束层面上而言主键相当于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存储引擎规定了所有的表都必须有且只有一个主键(主键

是组织数据的重要条件并且主键可以加快数据的查询速度)

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字段,也就是我们所说的编号

create table userinfo(
id int primary key,
);
自增(auto_increment)

MySQL中自增是不允许单独使用的,且一张表中只能有一列带自增属性的数据,一般与主键一起搭配使用

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

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

自增的固有特性:

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

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

外键(foreign key)
  • 外键引入

当我们需要存储员工信息时,表格中除了员工个人信息之外,一般还需要带有员工的部门相关信息

id	name	age		dep_name	dep_desc

这样子对于我们而言,一些具体数据所指代的内容并不够明确,无法确定这张表究竟是员工信息还是部门信息

而且数据堆叠也会造成存储空间的浪费

即使以上两点都无关紧要,我们也无法忽视这种存储方式极低的数据可扩展性,当我们需要修改某一项时,就需要修改所有内容

那么为了便于管理我们可以将表内的数据分别放在两个不同的表内,分为员工信息和部门信息

id	name	age
  
id	dep_name dep_desc

这样虽然解决了上述的问题,但是又不符合我们对员工信息与部门信息之间必须相关联的要求,那么这个时候我们就需要用到外键来解决这个问题

而在SQL语句中,外键字段就是用来标识数据与数据之间关系(也叫作表关系)的字段

  • 关系的判断

一对多

多对多

一对一

没有关系

所有的表关系可以分为以上四种

对于关系的判断我们可以用画图的方式来模拟换位思考

一对多关系

以员工表和部门表为例

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.修改数据的时候外键字段无法修改和删除

如果在表中的数据需要修改,我们可以使用级联更新(on update cascade)与级联删除(on delete cascade)

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 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
);

结论:两个都可以 关系就是'一对一'或者没有关系

针对'一对一'外键字段建在任何一方都可以,但是推荐建在查询频率较高的表中

免责声明 MySQL数据库,资源类别:文本, 浏览次数:35 次, 文件大小:-- , 由本站蜘蛛搜索收录2022-11-24 07:59:01。此页面由程序自动采集,只作交流和学习使用,本站不储存任何资源文件,如有侵权内容请联系我们举报删除, 感谢您对本站的支持。 原文链接:https://www.cnblogs.com/lf17603472426/p/16916113.html