栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

十四 - 数据库操作

十四 - 数据库操作

十四 - 数据库操作
  • 前言
    • 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)

特点: 自身带有服务器(C/S : Client/Server B/S: Browser/Server)

(2)掌握数据库产品的操作方法
  • 数据库的安装(开发)
  • 组成(服务器+客户端)
  • 连接(通过客户端程序访问数据库服务器)
  • 数据库的操作: 创建/查询/添加/删除/修改 (crud)
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是一个关系型数据库产品

商城购物
顾客(买)
商品(物)
订单
顾客买商品->订单

2. 软件的模式

软件的模式(MySQL两种模式都支持)

  • B/S: Browser/Server 浏览器/服务器 (淘宝/京东/数据库软件) 趋势
    阿里云/腾讯云/七牛云( phpadmin 用网页的形式连接操作数据库)

  • C/S: Client/Server 客户端/服务器 (QQ/微信/用友/数据库软件)

3. MySQL的安装位置

C:Program FilesMySQLMySQL Server 5.7bin

如果要在任意目录中访问: mysql.exe , 就需要将该路径配置在环境变量中

4. MySQL的数据文件位置

C:ProgramDataMySQLMySQL Server 5.7Data

5. 控制台常用命令(DOS)

在特殊的场景下(用户购买基础版的云服务,自己安装MySQL) , 使用控制台连接比较快

  • dir(directory) : 查询目录中的子文件夹和子文件信息 /w /p

  • cd(change dir) : 切换目录 cd+盘符 cd+… cd+目录名

  • 在控制台界面不关闭的情况下:

    • 方向键上下切换,选择曾经输入过的命令

    • 在选择文件夹名称的时候, tab可以补全

6. 控制台的连接方法
  1. 通过cmd打开控制台

  2. 找到mysql的目录,在bin目录下找到mysql.exe命令, 它就是数据库的连接命令

  3. 配置一个环境变量(目的: 把该目录作为任意位置都能识别的目录)
    (1)把MySQL的安装目录下的bin目录配置为环境变量, 使之可以在任何目录下运行
    (2)环境变量: 通过配置环境变量参数,把参数对应的目录设置为可以在任意目录下访问的位置(全局访问)
    (3)配置方法: 右键单击计算机图标->高级系统设置->环境变量->系统变量->Path中追加目标目录(目录之间用;隔开)
    具体安装教程

  4. 在控制台输入: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·

(2)解决方法 改表法

帐号不允许从远程登陆,只能在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. 操作1: myuser使用mypassword从任何主机连接到mysql服务器的话。
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
  1. 操作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;
  1. 操作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服务即可完成。

(3)总结
  • 第一:更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从"localhost"改为’%’。或者新加条记录,“host” 项为要访问的ip地址,并授权。重启mysql服务。
  • 第二:在系统防火墙添加例外端口:3306,并允许例外。

二、数据库操作

通过命令(SQL)和数据库服务器进行交互,服务器根据命令去数据库文件中操作,并返回结果给用户

  • 数据库的优势:存放多条记录,组织性强,可以永久保存,查询速度快(MySQL底层基于C)
  • 数据的增删改非常方便(通过命令可快速实现)
  • 学习成本小 , 交互能力强

SQL: Structed Query Language 结构化查询语言(基本上所有的数据库通用), 是和数据库交互的方法, 市面上大多数的数据库产品都使用相近的sql语法

1. 注意
  1. 在SQL中,所有的命令和关键字以及自定义名称都不区分大小写
    (1)关键字部分使用全大写
    (2)自定义名称(数据库名/数据表名/字段名)用小写字母开头

  2. 字符串使用单引号或双引号,建议还是使用单引号,方便在java/php/HTML程序中和代码字符串类型的参数进行嵌套

create table users(id int,name varchar(20))
"insert into users values(1001,'张三')"
insert into users values(1002,'李四')
  1. 所有的符号都必须是英文状态的符号,5.7版本可以直接使用双引号(配置可以改变)

  2. 所有的SQL命名必须以";"结尾(控制台才需要,exit/quit例外 ,在工具中选中的命令也可以不加)

  3. 关键字不能用于声明名称

  4. varchar和char如果不带单位长度,则表示1个字符

2. 通过cmd控制台启动操作界面的方法
  1. 进入如下目录C:Program FilesMySQLMySQL Server 5.7bin>

  2. (把完整的bin路径追加配置在环境变量中的path)

  3. 找到mysql.exe(连接MySQL服务器的命令)

  4. 启动服务的命令: net start MySQL57

  5. 停止的命令: net stop MySQL57

3. 完整的命令

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, 远程连接工具不受此影响

4. 数据库的SQL SHOW DATAbaseS;

只在控制台中有作用

显示所有的数据库


CREATE DATAbase 数据库名;

创建数据库


DROp 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
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

容易遇到的问题
  1. 字段值和字段名数量不匹配 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
  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'
    
  2. 数据值超出了字段限制
    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字节

(2)小数类型

float 、 double 和java对应

  • float 4字节
    • float(M,D) M:小数点前后的总位数 D:小数点后的位数
      float(5,2) 100.1036 -> 100.10 执行四舍五入
  • double 8字节

java的类型和数据库的字段类型要严格保持严格匹配: 减少数据库操作中的自动类型转换(mybatis会导致操作失败)

(3)日期类型
  • DATE 日期 2021-1-1
  • DATETIME 日期+时间 2021-1-1 14:00:00
  • TIME 时间14:00:00
  • TIMESTAMP 时间戳 毫秒值
(4)unsigned

无符号的类型,跟在整型/浮点型修饰

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你好

(1)修改数据库编码

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
11. 转义设置

定义名称时出现与关键字相同的名称时,需要添加转义符号`
(tab键上方),防止冲突出现异常。

create database database;  -- 报错
create database 'database'; -- 成功

三、数据库操作语言的分类:(实施工程师)

SQL中分为:

DCL

Database Control Language,数据库控制语言(grant/revoke):控制数据库权限,只有数据库拥有者才可以使用(DBA:Database Administrator)

  • grant的应用场景: 1.分配远程连接的权限 2.忘记MySQL的连接密码
DDL

Database Definition Language ,数据库定义语言(create database/table/view/index , drop,alter[add,drop,modify]),改变数据库和数据表的结构

DQL

Database Query Language , 数据库查询语言(select):利用固定的语法解决多变的业务

例如:SELECT 字段… FROM tableName

DML

Database Manipulation Language ,数据库操纵语言(insert/delete/update) , 修改数据表中的数据


四、约束 constraint
  • 背景: 在创建数据表的时候,应该就要给某些字段添加上行为上的控制

  • 例如:

    • 编号应该是不重复的,且是最重要的字段 , 考虑自动增长
    • 地址可以使用默认值,不用每次都重复添加, “地址不详”
    • 创建表的完整操作: 添加字段/类型/约束 constraint
    • 约束(CONSTRAINT):表中字段的规则
1. 主键约束 PRIMARY KEY :
  • 主键约束表示该字段不可以为null且不能重复,通常用于id字段
  • 作用: 作为记录的唯一标识用于区分,在查询时,主键字段含有index索引,所以速度最快
select * from users

select name from users

select uid from users #最快
  • 要求所有的表都必须具备至少一个主键

  • 实际开发中,主键的字段作为查询条件是最快的(MySQL做了优化)

  • 对于含有主键约束的字段添加重复值,报错:[Err] 1062 - Duplicate entry '1' for key 'PRIMARY'

  • 作用:

    1. 防止字段重复

    2. 防止字段为null

    3. 增加访问速度(主键会产生索引)

    4. 一般一张表中至少要有一个主键, 通常使用在id字段

2. 自增长约束 auto_increment
  • 作用: 让声明的字段自动增长值

  • 如果表中没有指定过id的值,自增字段从1开始

  • 主动添加过数据,自增将从最大的数开始自增

  • 自增字段不用赋值:如下

insert into users3 values(default); #对的
insert into users3(name) values(''); #对的,没有带id字段,会只用自增长的值
insert into users3 values(null); #对的
  • 应用场景:Id int primary key auto_increment
3. 非空约束

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号

  • 和主键约束对比:

    1. 主键不能为null, 唯一性约束可以为null

    2. 不能重复

    3. 都会生成key(会生成索引,查询速度都是最快的字段)

5. 默认值约束:

default : 给字段赋值时设定的默认值,可以被覆盖

address varchar(50) default '地址不详',
  • 应用场景: 地址(‘地址不详’)

6. 检查约束 check
  • 格式:字段名 字段类型 check(字段相关的关系或逻辑运算)

  • 注意:在MySQL中保留的check约束关键字,但没有任何作用,但在SQL Server上可以使用

  • MySQL实际上是通过数据类型enum来实现check约束的

    • enum:枚举,给定的取值范围
数据库引擎

MySQL中有两种常见的引擎 MyISAM / InnoDB , 在设计表的时候指定

  • MyISAM: 适合做大量的查询,默认的数据库引擎

  • InnoDB: 可以设置外键,支持事务操作(mySQL的标配)

外键约束 : foreign key
  • 作用: 通过外键建立起当前实体Entry中的某个字段和另一个实体中的主键的一一对应关系

  • 过程:

    1. 声明字段(数据类型要和主表完全一致)

    2. 关联的字段必须是一个key(primary key/ unique key)

  • 注意事项:

    • 外键和对应的主键的数据类型最好保持一致

    • 所有外键关联的表都必须使用InnoDB引擎

    • 对应关系如果没有外键,也是可以通过查询手段建立起来(弱关系)

    • 通过外键建立的联系是强关系

    • 外键必须关联到另一个表的具备索引的字段上(主键)

    • 在实际开发中,为了保证查询的效率不使用InnoDB, 而利用程序自身的控制达到类似的效果

    • 目前的开发中不推荐使用外键(影响查询效率)

  • 建立方法:

    • FOREIGN KEY (外键字段) REFERENCES 引用的表的表名(被引用的主键字段)
    • [on update cascade on delete cascade ]

数据表的建立, 标志着java中的实体类的参考标准创建了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/303302.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号