- 前言
- 1. 背景
- 2. 学习轨迹
- (1)常见数据库产品
- (2)掌握数据库产品的操作方法
- crud
- (3)通过Java 程序连接并操作数据库
- 3. 目标
- 一、MySQL
- 1. MySQL是一个关系型数据库产品
- 2. 软件的模式
- 3. MySQL的安装位置
- 4. MySQL的数据文件位置
- 5. 控制台常用命令(DOS)
- 6. 控制台的连接方法
- 7. 远程连接MySQL服务器的方法
- (1)背景
- (2)解决方法
- 改表法
- 授权法
- (3)总结
- 二、数据库操作
- 1. 注意
- 2. 通过cmd控制台启动操作界面的方法
- 3. 完整的命令
- 4. 数据库的SQL
- SHOW DATAbaseS;
- CREATE DATAbase 数据库名;
- DROp DATAbase 数据库名
- USE 数据库名称;
- 5. 数据表的SQL
- SHOW tables;
- select * from 数据表名称;
- desc 表名 / describle 表名;
- CREATE TABLE
- DROp TABLE 表名;
- ALTER TABLE 表名 ADD COLUMN 列名 类型;
- INSERT INTO 向数据表中添加记录
- MD5()
- 容易遇到的问题
- DELETE删除操作
- where中的条件
- 关系运算符
- 逻辑运算符
- 删除全部数据
- 修改数据
- 6. 关于字段类型
- (1)整数类型(int: integer)
- (2)小数类型
- (3)日期类型
- (4)unsigned
- (5)字符串类型
- 7. 三码合一
- (1)修改数据库编码
- (2)创建表时设定编码
- (3)创建数据库时设定编码
- 8. 注释的方法
- 9. 关于引号
- 10. navicat的使用
- 11. 转义设置
- 三、数据库操作语言的分类:(实施工程师)
- DCL
- DDL
- DQL
- DML
- 四、约束 constraint
- 1. 主键约束 PRIMARY KEY :
- 2. 自增长约束 auto_increment
- 3. 非空约束
- 4. 唯一性约束
- 5. 默认值约束:
- 6. ~~检查约束 check~~
- 数据库引擎
- ~~外键约束 : foreign key~~
在UserManager程序中, 数据的存储通过文件来持久化, 如果数据的类型变多, 并且交互变多
例如: 增加基金 -> 用户购买了基金
就可能存在数据的冗余
1. 背景数据持久化, 数据量较大 , 用户需求
数据库编程 (JDBC: Java Database Connection java连接数据库操作体系)
2. 学习轨迹 (1)常见数据库产品
- DB2(ibm) :大型企业级数据库,收费(巨贵),不开源
- Oracle(甲骨文):大型企业级数据库,收费(巨贵),不开源
- SQL Server(微软) :中型数据库软件
- MySQL:小型的,轻量级数据库,免费,开源(google) ,初学者适合以MySQL作为切入点。官网:www.mysql.com(可以下载MySQL最新版本)
- MariaDB(Linux:centOS) :小型的,轻量级数据库,免费,开源(google)
(2)掌握数据库产品的操作方法特点: 自身带有服务器(C/S : Client/Server B/S: Browser/Server)
- 数据库的安装(开发)
- 组成(服务器+客户端)
- 连接(通过客户端程序访问数据库服务器)
- 数据库的操作: 创建/查询/添加/删除/修改 (crud)
在做计算处理时的增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。
学习方法: 掌握大量的数据库命令SQL(Structed Query Language 结构化查询语言)命令
(3)通过Java 程序连接并操作数据库3. 目标
-
掌握数据库的服务器搭建和连接方法(两个组成部分: 服务器端/客户端)
-
掌握数据库项目的创建/数据表的创建
-
掌握增删改操作数据表中数据的方法
-
掌握MySQL中常见的错误提示类型
-
掌握系列查询方法(简单/连接/左连接/右连接/内连接/模糊/排序)
-
学习方法: 记忆SQL(Structed Query Language,专门为数据库服务的语言,结构化查询语言)的相关命令,sql在所有的数据库产品中都是通用的
-
分类
- DCL(C: Control 控制)
- DDL (D: Definition 定义)
- DML (M: Manipulation 操纵)
- DQL (Q: Query) (D: Database L: Language)
一、MySQL 1. MySQL是一个关系型数据库产品
商城购物
顾客(买)
商品(物)
订单
顾客买商品->订单
软件的模式(MySQL两种模式都支持)
-
B/S: Browser/Server 浏览器/服务器 (淘宝/京东/数据库软件) 趋势
阿里云/腾讯云/七牛云( phpadmin 用网页的形式连接操作数据库) -
C/S: Client/Server 客户端/服务器 (QQ/微信/用友/数据库软件)
C:Program FilesMySQLMySQL Server 5.7bin
如果要在任意目录中访问: mysql.exe , 就需要将该路径配置在环境变量中
C:ProgramDataMySQLMySQL Server 5.7Data
在特殊的场景下(用户购买基础版的云服务,自己安装MySQL) , 使用控制台连接比较快
-
dir(directory) : 查询目录中的子文件夹和子文件信息 /w /p
-
cd(change dir) : 切换目录 cd+盘符 cd+… cd+目录名
-
在控制台界面不关闭的情况下:
-
方向键上下切换,选择曾经输入过的命令
-
在选择文件夹名称的时候, tab可以补全
-
-
通过cmd打开控制台
-
找到mysql的目录,在bin目录下找到mysql.exe命令, 它就是数据库的连接命令
-
配置一个环境变量(目的: 把该目录作为任意位置都能识别的目录)
(1)把MySQL的安装目录下的bin目录配置为环境变量, 使之可以在任何目录下运行
(2)环境变量: 通过配置环境变量参数,把参数对应的目录设置为可以在任意目录下访问的位置(全局访问)
(3)配置方法: 右键单击计算机图标->高级系统设置->环境变量->系统变量->Path中追加目标目录(目录之间用;隔开)
具体安装教程 -
在控制台输入:mysql -h 127.0.0.1 -u root -p
mysql: 核心命令
-h: host 服务器的地址, 127.0.0.1表示本机, 也可以用localhost表示本机(可以省略)
-u: user mysql服务中默认自带的用户, 超级管理员账号 root
-p: password , 连接服务器的访问密码
成功连接, 指示符会变为: mysql>
如果要退出: 输入 exit; quit
7. 远程连接MySQL服务器的方法 (1)背景
当远程连接MySQL服务器的时候,出现错误提示:
ERROR 1130: Host '172.16.11.13' is not allowed to connect to this MySQL server·
帐号不允许从远程登陆,只能在localhost。
这个时候只要在localhost的那台电脑,登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从"localhost"改为"%"
mysql -u root -pvmware mysql>use mysql; mysql>update user set host = '%' where user = 'root'; mysql>select host, user from user;授权法
- 操作1: myuser使用mypassword从任何主机连接到mysql服务器的话。
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
- 操作2:用户myuser从ip为172.16.11.13的主机连接到mysql服务器,并使用mypassword作为密码
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'172.16.11.13' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
- 操作3:在window自带的防火墙里的例外添加3306端口
形如:
mysql -u root -p mysql>use mysql; mysql>select 'host' from user where user='root'; mysql>update user set host = '%' where user ='root'; mysql>flush privileges; mysql>select 'host' from user where user='root';
第一句是以权限用户root登录
第二句:选择mysql库
第三句:查看mysql库中的user表的host值(即可进行连接访问的主机/IP名称)
第四句:修改host值(以通配符%的内容增加主机/IP地址),当然也可以直接增加IP地址
第五句:刷新MySQL的系统权限相关表
第六句:再重新查看user表时,有修改。。
重起mysql服务即可完成。
- 第一:更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从"localhost"改为’%’。或者新加条记录,“host” 项为要访问的ip地址,并授权。重启mysql服务。
- 第二:在系统防火墙添加例外端口:3306,并允许例外。
二、数据库操作
通过命令(SQL)和数据库服务器进行交互,服务器根据命令去数据库文件中操作,并返回结果给用户
- 数据库的优势:存放多条记录,组织性强,可以永久保存,查询速度快(MySQL底层基于C)
- 数据的增删改非常方便(通过命令可快速实现)
- 学习成本小 , 交互能力强
SQL: Structed Query Language 结构化查询语言(基本上所有的数据库通用), 是和数据库交互的方法, 市面上大多数的数据库产品都使用相近的sql语法
1. 注意-
在SQL中,所有的命令和关键字以及自定义名称都不区分大小写
(1)关键字部分使用全大写
(2)自定义名称(数据库名/数据表名/字段名)用小写字母开头 -
字符串使用单引号或双引号,建议还是使用单引号,方便在java/php/HTML程序中和代码字符串类型的参数进行嵌套
create table users(id int,name varchar(20)) "insert into users values(1001,'张三')" insert into users values(1002,'李四')
-
所有的符号都必须是英文状态的符号,5.7版本可以直接使用双引号(配置可以改变)
-
所有的SQL命名必须以";"结尾(控制台才需要,exit/quit例外 ,在工具中选中的命令也可以不加)
-
关键字不能用于声明名称
-
varchar和char如果不带单位长度,则表示1个字符
-
进入如下目录C:Program FilesMySQLMySQL Server 5.7bin>
-
(把完整的bin路径追加配置在环境变量中的path)
-
找到mysql.exe(连接MySQL服务器的命令)
-
启动服务的命令: net start MySQL57
-
停止的命令: net stop MySQL57
mysql -h 127.0.0.1 -u root -p world
-
mysql -u root -p 也可以省略-h , 表示默认连接本机
-
mysql : 连接
-
-h: 主机地址(如果是本地,可以省略, 本地还可以用localhost)
-
-u: 用户名
-
-p: 用户密码
-
world : 数据库名称( 可以省略use)
-
passwrod: root
-
mysql> quit; 退出mysql界面
-
所有的命令都要以";"结尾 - 只针对控制台cmd, 远程连接工具不受此影响
只在控制台中有作用
显示所有的数据库
CREATE DATAbase 数据库名;
创建数据库
删除数据库
Drop DATAbase usermanager;
看到结果:
Query OK, 1 rows affected (0.35 sec) -- 表示成功, 4行被影响 , 花费的时间: 0.35秒
USE 数据库名称;
切换当前操作的主数据库
看到Database changed表示切换成功
否则会提示: ERROR 1046 (3D000): No database selected
USE usermanager; Database changed
5. 数据表的SQL SHOW tables;
显示当前主数据库的所有数据表
SHOW TABLES; +-----------------------+ | Tables_in_usermanager | +-----------------------+ | user | +-----------------------+ 1 row in set (0.00 sec)
select * from 数据表名称;
显示表中的所有记录
* 表示所有字段
SELECt * FROM user; +------+--------+-------------+--------+------+-------+-------+ | id | name | phone | pwd | age | vipid | isvip | +------+--------+-------------+--------+------+-------+-------+ | 1 | 张三丰 | 13333334444 | 123456 | 20 | NULL | | +------+--------+-------------+--------+------+-------+-------+ 1 row in set (0.00 sec)
其中:
-
select : 表示查询的关键字(重要)
-
*:表示所有的字段 , 也可以用具体的字段名替换
-
from : 关键字, 从…
-- MySQL中出现频率最高的错误提示 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'froms staff' at line 1 -- 修改方法: 只看near后引号中的内容, 该部分就是发生语法错误的附近位置
desc 表名 / describle 表名;
查看表结构
DESC user; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | phone | varchar(15) | YES | | NULL | | | pwd | varchar(32) | YES | | NULL | | | age | int(11) | YES | | NULL | | | vipid | int(11) | YES | | NULL | | | isvip | bit(1) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 7 rows in set (0.00 sec)
-
Field 表示字段
-
Type: 数据类型
-
Null: 是否允许该字段填充空值
-
Key: 键的约束
-
Default: 默认值
-
Null 表示空值
添加数据的顺序:
连接数据库服务-创建数据库-引用数据库-创建数据表-添加记录
CREATE TABLE 表名( 字段名1 字段类型 [字段的约束], 字段名2 字段类型 [字段的约束], ... 字段名n 字段类型 [字段的约束] );
创建数据表,字段代表表中的特征项,可以有多个字段组成一张表,字段与字段之间用","隔开,最后一个字段后面不能加任何符号
CREATE TABLE user(id int,
name VARCHAR(20),
phone VARCHAR(15),
pwd VARCHAR(32),
age INT,
vipid INT,
isvip bit
);
Query OK, 0 rows affected (0.03 sec)
DROp TABLE 表名;
删除表
drop table hhh; Query OK, 0 rows affected (0.00 sec) 看到该提示表示删除成功
ALTER TABLE 表名 ADD COLUMN 列名 类型;
给表中添加列
alter table users add column name varchar(20);
INSERT INTO 向数据表中添加记录
INSERT INTO 表名(字段名1,字段名2,...) VALUES(值1,值2,...) insert into staff(sid,name,age) values(1001,'张三丰',20); insert into staff values(1001,'张三丰',20); -- 省略了字段列表,即表示添加为全字段匹配 insert into staff(sid,name) values(1002,'李四喜');MD5()
MD5加密算法,括号内按字符串处理(可以加引号,也可以不加,效果一致)
举例:SELECT MD5(123456) – 查询123456在加密后显示的值
INSER TINTO tb_user(user_id,user_name,user_pwd,isVip,user_vipId) VALUES(1,'zhang',MD5('123'),1,1001);
-- 省略字段名(必须是全字段数据)
INSERT INTO tb_user VALUES(2,'wang',MD5('321'),0,NULL);
-- 添加部分字段的值
INSERT INTO tb_user(user_id,user_name,user_pwd) VALUES(3,'fang',MD5('123'));
-- 同时添加多条记录
INSERT INTO tb_user(user_id,user_name,user_pwd) VALUES(4,'aaa',MD5('123')),(5,'bbb',MD5(123))
-- 成功的标志:
Query OK, 1 row affected
添加的数据超过了应有的长度,虽然可以运行,但会在结果中对越界的数据自动做处理:
insert into staff(sid,name,age) values(1001,'张三',2000); -- 2000越界了,年龄会存储为255 insert into staff(sid,name,age) values(1001,'张三丰123123123',2000); -- 姓名长度越界,只能保存10位字符串长度: 张三丰1231231
容易遇到的问题
- 字段值和字段名数量不匹配 Column count doesn't match value count at row 1
INSERT INTO tb_user VALUES(2,'wang',MD5('321'),0);
ERROR 1136 (21S01): Column count doesn't match value count at row 1
-
字符串必须添加单引号,否则会被当做一个字段名处理
INSERT INTO tb_user(user_id,user_name,user_pwd) VALUES(7,fang,MD5('123')); ERROR 1054 (42S22): Unknown column 'fang' in 'field list' -
数据值超出了字段限制
Data too long for column 'name' at row 1
DELETE删除操作
DELETE FROM 表名 [WHERe 条件]
delete from users where id=1;
where中的条件
[ 字段名 运算符 字段值 ]构成
关系运算符-
= 相等
-
!= 或 <> 不相等
-
< > <= >= 其它和java一致
-
IS NULL 、IS NOT NULL :当判断为null的时候不能用=等号,要用is 和is not
-
in 、 not in : 表示范围
-
and 表示并列 条件1 and 条件2 and 条件3
-
or 表示或
-
not 非
select或者update 语句中也可以使用where, 用法和此处的where完全一致
delete from staff where sid = 1001 UPDATe tb_user SET isVip=1 ,user_vipId=1001 where user_id=2; UPDATE tb_user SET isVip=0 where user_id=1; SELECT * FROM tb_user WHERe user_vipId is NULL; SELECt * FROM tb_user WHERe user_vipId is NOT NULL; SELECt * FROM tb_user WHERe user_id != 1; SELECt * FROM tb_user WHERe user_id > 1; SELECt * FROM tb_user WHERe user_id < 1; SELECt * FROM tb_user WHERe user_id >= 1; SELECt * FROM tb_user WHERe user_id <=1; SELECt * FROM tb_user WHERe user_id > 1 AND isVip=1; SELECt * FROM tb_user WHERe user_id > 1 & isVip=1; SELECt * FROM tb_user WHERe user_id > 1 && isVip=1; SELECt * FROM tb_user WHERe user_id > 1 OR isVip =0; SELECt * FROM tb_user WHERe user_id > 1 || isVip =0; SELECt * FROM TB_USER where isVisible=12134234; INSERT INTO tb_user values(4,'bbb',MD5(321),0,NULL,0); SELECt * FROM tb_user WHERe user_id in(1,2); SELECt * FROM tb_user WHERe user_id in(1,4); SELECt * FROM tb_user WHERe user_id in(1,4,5,6); SELECt * FROM tb_user WHERe user_id in(2); INSERT INTO tb_user values(5,'ccc',MD5(321),0,NULL,0); SELECt * FROM tb_user WHERe user_id>=2 AND user_id<=4; SELECt * FROM tb_user WHERe user_id BETWEEN 2 AND 4; SELECt * FROM tb_user WHERe user_id BETWEEN 2 AND 5;
删除全部数据
DELETe FROM 表名 表示删除全部记录 , 但自增id增长的增量保持不变
TRUNCATE 表名 也是删除全部记录 , 但自增id增长的增量也一并清零
修改数据
UPDATe 表名 SET 字段名=值[,字段名2=值2,字段3=值3...] [WHERe 条件]
update staff set name='哈哈哈'; --当不添加条件时, 会将所有记录中的字段都修改 update staff set name='嘻嘻' where sid is null; --带条件的常用 update staff set name='嘻嘻',age=20 where sid is null; --带条件的常用
6. 关于字段类型 (1)整数类型(int: integer)
利用unsigned关键字设置为无符号整数,添加到数值类型的后边
-
tinyint 1字节 2^10 -> 1024(2^8=256,如果是正整数: 0-255; 如果没有正负限制:-128~127)
-
smallint 2字节
-
mediumint 3字节
-
int(最常用的整数类型) 整数类型 4字节 : int(n) n表示位数
-
bigint 8字节
float 、 double 和java对应
- float 4字节
- float(M,D) M:小数点前后的总位数 D:小数点后的位数
float(5,2) 100.1036 -> 100.10 执行四舍五入
- float(M,D) M:小数点前后的总位数 D:小数点后的位数
- double 8字节
java的类型和数据库的字段类型要严格保持严格匹配: 减少数据库操作中的自动类型转换(mybatis会导致操作失败)
(3)日期类型- DATE 日期 2021-1-1
- DATETIME 日期+时间 2021-1-1 14:00:00
- TIME 时间14:00:00
- TIMESTAMP 时间戳 毫秒值
无符号的类型,跟在整型/浮点型修饰
Age tinyint unsigned
(5)字符串类型char(10)
varchar(10)
7. 三码合一
(浏览器/数据库/程序IDE 都使用UTF-8):保证程序中不出现乱码
-
char/varchar 字符串类型 char(n)/varchar(n) n表示字符数量(取决于编码,一般使用utf-8)
-
char: 固定长度字符串 char(3) "你好’ ’ "
-
varchar: 可变长度字符串 varchar(3) 你好 (常用) java你好
-
SET names 'UTF8';
- 注意:在控制台使用utf-8会报错(网页上采用才行)
mysql> SET names 'utf-8'; ERROR 1115 (42000): Unknown character set: 'utf-8'
- 正确:
mysql> SET names 'utf8'; Query OK, 0 rows affected (0.00 sec)
(2)创建表时设定编码
CREATE TABLE student(... ) ENGINE=InnoDB DEFAULT CHARSET=utf8; #对表创建进行编码(3)创建数据库时设定编码
CREATE DATEAbase userInfo charset='UTF8'; CREATE DATEAbase userInfo character set 'UTF8';
8. 注释的方法
单行: -- 注释语言 或者 #注释语言
多行
9. 关于引号- 在sql操作中,遇到字符串/日期字符串的数值时,必须用单引号引起来
Delete from tableName where name=''
- 如果是非字符串类型的数据(int、double) , 单引号加或者不加均可
Delete from tableName where sid = 1001 -- 对的
Delete from tableName where sid = '1001' -- 对的
insert into users values('7','fff','20'); -- 对的
10. navicat的使用
- 使用查询工具->新建查询 ->sql命令
- 选中要执行的sql命令, 通过执行按钮或快捷键(ctrl+shift+r)
- 如果不选中,表示以全部(脚本)方式执行sql
定义名称时出现与关键字相同的名称时,需要添加转义符号`
(tab键上方),防止冲突出现异常。
create database database; -- 报错 create database 'database'; -- 成功
三、数据库操作语言的分类:(实施工程师)
SQL中分为:
DCLDatabase Control Language,数据库控制语言(grant/revoke):控制数据库权限,只有数据库拥有者才可以使用(DBA:Database Administrator)
- grant的应用场景: 1.分配远程连接的权限 2.忘记MySQL的连接密码
Database Definition Language ,数据库定义语言(create database/table/view/index , drop,alter[add,drop,modify]),改变数据库和数据表的结构
DQLDatabase Query Language , 数据库查询语言(select):利用固定的语法解决多变的业务
例如:SELECT 字段… FROM tableName
DMLDatabase Manipulation Language ,数据库操纵语言(insert/delete/update) , 修改数据表中的数据
四、约束 constraint
-
背景: 在创建数据表的时候,应该就要给某些字段添加上行为上的控制
-
例如:
- 编号应该是不重复的,且是最重要的字段 , 考虑自动增长
- 地址可以使用默认值,不用每次都重复添加, “地址不详”
- 创建表的完整操作: 添加字段/类型/约束 constraint
- 约束(CONSTRAINT):表中字段的规则
- 主键约束表示该字段不可以为null且不能重复,通常用于id字段
- 作用: 作为记录的唯一标识用于区分,在查询时,主键字段含有index索引,所以速度最快
select * from users select name from users select uid from users #最快
-
要求所有的表都必须具备至少一个主键
-
实际开发中,主键的字段作为查询条件是最快的(MySQL做了优化)
-
对于含有主键约束的字段添加重复值,报错:[Err] 1062 - Duplicate entry '1' for key 'PRIMARY'
-
作用:
-
防止字段重复
-
防止字段为null
-
增加访问速度(主键会产生索引)
-
一般一张表中至少要有一个主键, 通常使用在id字段
-
-
作用: 让声明的字段自动增长值
-
如果表中没有指定过id的值,自增字段从1开始
-
主动添加过数据,自增将从最大的数开始自增
-
自增字段不用赋值:如下
insert into users3 values(default); #对的
insert into users3(name) values(''); #对的,没有带id字段,会只用自增长的值
insert into users3 values(null); #对的
- 应用场景:Id int primary key auto_increment
NOT NULL/DEFAULT NULL(默认为空) , 在table 中所有的字段在没有约束的情况下默认都是可以为null的
create table users4( id int primary key , name varchar(10) null) #默认可以赋值为null, 此处也可以省略null create table users4( id int primary key , name varchar(10) not null) --非空约束 #例如添加数据时设置为空会报错 insert into users4 values(1 , null); ERROR 1048 (23000): Column 'name' cannot be null
应用场景:注册的时候的用户名和密码
4. 唯一性约束-
unique, 和主键约束的区别在于:唯一性约束可以有多个null(),但不能有重复的实体值entry
- 例如:非空且唯一: email varchar(20) not null unique
-
适合使用唯一性约束的字段: qq号/手机号/邮箱号/ID
-
应用场景: 邮箱/手机/qq号
-
和主键约束对比:
-
主键不能为null, 唯一性约束可以为null
-
不能重复
-
都会生成key(会生成索引,查询速度都是最快的字段)
-
default : 给字段赋值时设定的默认值,可以被覆盖
address varchar(50) default '地址不详',
- 应用场景: 地址(‘地址不详’)
6.
-
格式:字段名 字段类型 check(字段相关的关系或逻辑运算)
-
注意:在MySQL中保留的check约束关键字,但没有任何作用,但在SQL Server上可以使用
-
MySQL实际上是通过数据类型enum来实现check约束的
- enum:枚举,给定的取值范围
MySQL中有两种常见的引擎 MyISAM / InnoDB , 在设计表的时候指定
-
MyISAM: 适合做大量的查询,默认的数据库引擎
-
InnoDB: 可以设置外键,支持事务操作(mySQL的标配)
-
作用: 通过外键建立起当前实体Entry中的某个字段和另一个实体中的主键的一一对应关系
-
过程:
-
声明字段(数据类型要和主表完全一致)
-
关联的字段必须是一个key(primary key/ unique key)
-
-
注意事项:
-
外键和对应的主键的数据类型最好保持一致
-
所有外键关联的表都必须使用InnoDB引擎
-
对应关系如果没有外键,也是可以通过查询手段建立起来(弱关系)
-
通过外键建立的联系是强关系
-
外键必须关联到另一个表的具备索引的字段上(主键)
-
在实际开发中,为了保证查询的效率不使用InnoDB, 而利用程序自身的控制达到类似的效果
-
目前的开发中不推荐使用外键(影响查询效率)
-
-
建立方法:
- FOREIGN KEY (外键字段) REFERENCES 引用的表的表名(被引用的主键字段)
- [on update cascade on delete cascade ]
数据表的建立, 标志着java中的实体类的参考标准创建了



