数据库类型
常用数据类型
详细数据类型
需要注意的是:
-
BOOLEAN在数据库保存的是tinyInt类型,false为0,true就是1
-
char是定长,varchar是变长,char存储时,如果字符数没有达到定义的位数,后面会用空格填充到指定长度,而varchar没达到定义位数则不会填充,按实际长度存储。比如一个 char(10) 类型的列它的长度是固定为 10 个字符。当我们插入一个长度为 5 的字符串时,MySQL 会在字符串的末尾添加 5 个空格,以填充到 10 个字符的长度。但是在查询结果中,这些空格会被省略,length()函数查不出区别,但是在储存中是有区别的。
-
char长度固定,尽管 char 类型存储速度可能略快于 varchar 类型,但这种差异通常可以忽略不计。实际上,在大多数情况下,数据存储空间和查询性能更为重要,实际开发中varchar远比char更常见。
-
timestamp 类型的值会随着时区的变化而变化。另外,timestamp 类型的默认值和更新行为与其他日期时间类型有所不同。timestamp 类型的列在插入或更新时,如果未显式设置值,会自动设置为当前的 UTC 日期时间。
-
year 类型用于表示年份,并支持两种显示格式:2 位数字表示(年份的后两位)和 4 位数字表示(完整年份)。它占用 1 字节的存储空间,值的范围是从 '1901' 到 '2155'。在 MySQL 中,如果使用 2 位数字表示年份,系统会根据一个范围(默认为 1970-2069)将其转换为 4 位数字表示的年份。对于 '00' 到 '69',系统会将其转换为 '2000' 到 '2069';对于 '70' 到 '99',系统会将其转换为 '1970' 到 '1999'。
比如:
-- 插入为2022
INSERT INTO example (year_col) VALUES ('22');
-- 插入为1970
INSERT INTO example (year_col) VALUES ('70');
-- 如果要插入2070,还是要具体指明4位数
INSERT INTO example (year_col) VALUES ('2070');
基本操作
DDL
数据库管理
创建数据库
格式:
create database 数据库名;
create database 数据库名 character set 字符集;
例如:
#创建数据库 数据库中数据的编码采用的是安装数据库时指定的默认编码 utf8
CREATE DATABASE day21_1;
#创建数据库 并指定数据库中数据的编码
CREATE DATABASE day21_2 CHARACTER SET gbk;
#如果创建之后 修改数据库编码
ALTER DATABASE day21_2 CHARACTER SET=utf8;
查看数据库
查看数据库MySQL服务器中的所有的数据库:
show databases;
查看某个数据库的定义的信息:
show create database 数据库名;
例如:
show create database day21_1;
删除数据库
drop database 数据库名称;
例如:
drop database day21_2;
其他的数据库操作命令
切换数据库:
格式:use 数据库名;
例如:
use day21_1;
查看正在使用的数据库:
select database();
图形化结果类似于下图
表管理
创建表
格式:
create table 表名(
字段名 类型(长度) 约束,
字段名 类型(长度) 约束
);
例如:
创建分类表
CREATE TABLE sort (
sid INT, #分类ID
sname VARCHAR(100) #分类名称
);
温馨提示:你创建了数据库(默认innodb引擎),就创建了一块逻辑空间,实际在磁盘上创建了一个文件夹,你创建了一个表,实际磁盘生成了一个.ibd文件,你可以在C:\ProgramData\MySQL\MySQL Server 8.0\Data目录下验证一下,路径中的ProgramData是隐藏文件夹。
在 Linux 系统上,MySQL 的数据文件通常位于 /var/lib/mysql 目录下
举个例子,你创建了test数据库,然后你执行建表语句如下
CREATE TABLE temp(/*实验精度丢失问题*/
id INT UNSIGNED PRIMARY KEY,
num DECIMAL(20, 10) /*数字总位数20,保留小数点后10位*/
)
实际在你的磁盘上是这样存储的
查看表
查看数据库中的所有表:
格式:
show tables;
图形化结果类似于下图
这里的命名就告诉了你是 test 数据库里面的表
查看表结构:
有两种方式
方法一: desc 表名;
方法二: SHOW COLUMNS FROM 表名;
例如:
DESC student;
SHOW COLUMNS FROM student;
/* 这两种方式结果一模一样,第一种更常见,显然命令更短你也更愿意用 */
图形化结果类似于下图
如果在建表初期比较粗心,某些字段可以忘记写了comment注释信息,导致后续安全合规不通过,如何快速查看呢?
show full columns from 表名 where comment = '';
这样就可以很快筛选出没有comment的字段进行相应修改处理
重命名表
- 方式一:使用RENAME
RENAME TABLE emp
TO myemp;
- 方式二:
ALTER table dept
RENAME [TO] detail_dept; -- [TO]可以省略
- 必须是对象的拥有者
删除表
在MySQL中,当一张数据表没有与其他任何数据表形成关联关系时,可以将当前数据表直接删除。
-
数据和结构都被删除
-
所有正在运行的相关事务被提交
-
所有相关索引被删除
语法格式:
DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, …, 数据表n];
IF EXISTS的含义为:如果当前数据库中存在相应的数据表,则删除数据表;如果当前数据库中不存在相应的数据表,则忽略删除语句,不再执行删除数据表的操作。
举例:
DROP TABLE dept80;
DROP TABLE 语句不能回滚
清空表
TRUNCATE TABLE语句:
-
删除表中所有的数据
-
释放表的存储空间
举例:
TRUNCATE TABLE detail_dept;
TRUNCATE语句不能回滚,而使用 DELETE 语句删除数据,可以回滚
对比:
SET autocommit = FALSE;
DELETE FROM emp2;
#TRUNCATE TABLE emp2;
SELECT * FROM emp2;
ROLLBACK;
SELECT * FROM emp2;
修改表结构格式(实际开发最常用)
alter table 表名 add 列名 类型(长度) 约束;
作用:修改表添加列.
例如:
#1,为分类表添加一个新的字段为 分类描述 varchar(20)
ALTER TABLE sort ADD sdesc VARCHAR(20);
当然,想添加多个字段分类怎么做呢?
/*添加多个列方法一*/
ALTER TABLE student
ADD address VARCHAR(200) NOT NULL,
ADD home_tel CHAR(11) NOT NULL;
/*add语句之间用逗号分隔,最后用分号结束*/
/*添加多个列方法二*/
ALTER TABLE student
ADD (address VARCHAR(200) NOT NULL,home_tel CHAR(11) NOT NULL);
值得注意的是:
如果表需要添加多列,而有一列字段home_tel之前已经添加过了,结果会显示Duplicate column name 'home_tel',那么你本次添加的多列字段都是无效的,即全部添加失败
如果我想将这个字段添加到某个字段之后而不是末尾怎么办呢?
alter table 表名 add 列名 类型(长度) 约束 after 某个字段;
比如我想在age字段的后面加一个字段sex,而不是在最后一个字段末尾添加
alter table student add column sex char(1) not null comment '性别' after age;
新增列的时候,也可以同时新增索引,后续讲解索引的时候也会提到,比如
ALTER TABLE student
ADD address VARCHAR(200) NOT NULL,
ADD home_tel CHAR(11) NOT NULL AFTER address,
ADD INDEX idx_student_address (address),
ADD INDEX idx_student_phone (phone);
alter table 表名 modify 列名 类型(长度) 约束;
作用:修改表修改列的类型长度及约束.
例如:
#2, 为分类表的分类名称字段进行修改,类型varchar(50) 添加约束 not null
ALTER TABLE sort MODIFY sname VARCHAR(50) NOT NULL; /* 添加约束NOT NULL */
ALTER TABLE student
MODIFY home_tel VARCHAR(20) NOT NULL; /*CHAR(11)修改为VARCHAR(200)*/
同理,和add类似,需要修改多个列的类型长度及约束,那么modify语句之间用逗号分隔,最后一句的末尾用分号结束。
alter table 表名 change 旧列名 新列名 类型(长度) 约束;
作用:修改表修改列名.
例如:
#3, 为分类表的分类名称字段进行更换 更换为 snamesname varchar(30)
ALTER TABLE sort CHANGE sname snamename VARCHAR(30);
同理,和add类似,需要修改多个列的字段名,那么change语句之间用逗号分隔,最后一句的末尾用分号结束。
alter table 表名 drop 列名;
作用:修改表删除列.
例如:
#4, 删除分类表中snamename这列
ALTER TABLE sort DROP snamename;
ALTER TABLE student
DROP home_address,
DROP home_tel;
同理,和add类似,需要删除多列,那么drop语句之间用逗号分隔,最后一句的末尾用分号结束
rename table 表名 to 新表名;
作用:修改表名
例如:
#5, 为分类表sort 改名成 category
RENAME TABLE sort TO category;
alter table 表名 character set 字符集;
作用:修改表的字符集
例如:
#6, 为分类表 category 的编码表进行修改,修改成 gbk
ALTER TABLE category CHARACTER SET gbk;
表列管理
使用 ALTER TABLE 语句可以实现:
- 向已有的表中添加列
- 修改现有表中的列
- 删除现有表中的列
- 重命名现有表中的列
追加一个列
语法格式如下:
ALTER TABLE 表名 ADD 【COLUMN】 字段名 字段类型 【FIRST|AFTER 字段名】;
举例:
ALTER TABLE dept80
ADD job_id varchar(15);
修改一个列
可以修改列的数据类型,长度、默认值和位置
修改字段数据类型、长度、默认值、位置的语法格式如下:
ALTER TABLE 表名 MODIFY 【COLUMN】 字段名1 字段类型 【DEFAULT 默认值】【FIRST|AFTER 字段名2】;
举例:
ALTER TABLE dept80
MODIFY last_name VARCHAR(30);
ALTER TABLE dept80
MODIFY salary double(9,2) default 1000;
对默认值的修改只影响今后对表的修改
重命名一个列
使用 CHANGE old_column new_column dataType子句重命名列。语法格式如下:
ALTER TABLE 表名 CHANGE 【column】 列名 新列名 新数据类型;
举例:
ALTER TABLE dept80
CHANGE department_name dept_name varchar(15);
删除一个列
删除表中某个字段的语法格式如下:
ALTER TABLE 表名 DROP 【COLUMN】字段名
举例:
ALTER TABLE dept80
DROP COLUMN job_id;
DML
数据操纵语言DML(Data Manipulation Language),用户通过它可以实现对数据库的基本操作。
插入操作
DML语句:INSERT
在 MySQL 中,INSERT
语句用于将一行或者多行数据插入到数据表的指定列中。
以下是 INSERT
语句的语法:
INSERT INTO table_name (column_1, column_2, ...) # 插入单行数据
VALUES (value_1, value_2, ...);
---
INSERT INTO table_name (column_1, column_2, ...) # 插入多行数据
VALUES (value_11, value_12, ...),
(value_21, value_22, ...)
...;
语句说明:① INSERT INTO 和 VALUES 都是关键字;② INSERT INTO 后跟表名 table_name;③ 表名 table_name 后跟要插入数据的列名列表。列名放在小括号中,多个列表使用逗号分;④ VALUES 关键字之后的小括号中是值列表。值的数量要和字段的数量相同。值的位置和列的位置一一对应;⑤ 当插入多行数据时,多个值列表之间使用逗号分隔;⑥ INSERT 语句返回插入的行数。
使用 INSERT 插入数据
为了演示 INSERT
的用法,我们通过以下 CREATE TABLE
语句创建一个表命名为 user
。如下
CREATE TABLE user (
id INT AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
age INT,
birthday DATE,
PRIMARY KEY (id)
);
以下语句向 user
表中插入新行
INSERT INTO user (name, age) # 插入单行数据
VALUES ("Jim", 18);
---
Query OK, 1 row affected (0.00 sec) # 输出中的 1 row affected 代表已经成功插入了 1 行数据
我们也可以通过以下 SQL 查询 user
表的数据,以验证是否成功插入
SELECT * FROM user;
注意:① id
列的值是自动生成的,因为它是 AUTO_INCREMENT
列;② birthday
列值为 NULL
,因为我们只插入了 name
和 age
列。
插入多行数据:
INSERT INTO user (name, age) # 插入多行数据
VALUES ("Tim", 19), ("Lucy", 16);
---
Query OK, 2 rows affected (0.00 sec) # 输出中的 2 row affected 代表已经成功插入了 2 行数据
Records: 2 Duplicates: 0 Warnings: 0 # Records: 2 代表有 2 行数据要插入到表中
# Duplicates: 0 代表重复的行数是 0
# Warnings: 0 代表需要注意的行数是 0
我们也可以通过以下 SQL 查询 user
表的数据,以验证是否成功插入:
SELECT * FROM user;
如果要插入日期类型的字段,可以使用 YYYY-MM-DD
格式的文本字符串:
INSERT INTO user(name, age, birthday)
VALUES('Jack', 20, '2000-02-05');
---
Query OK, 1 row affected (0.00 sec)
我们可以通过以下 SQL 查询 user
表的数据,以验证是否成功插入:
SELECT * FROM user;
使用 INSERT 修饰符
在 MySQL 中, INSERT 语句支持 4 个修饰符:
- LOW_PRIORITY: 如果你指定了 LOW_PRIORITY 修饰符,MySQL 服务器将延迟执行 INSERT 操作直到没有客户端对表进行读操作。LOW_PRIORITY 修饰符影响那些只支持表级锁的存储引擎,比如: MyISAM, MEMORY, 和 MERGE;
- HIGH_PRIORITY: 如果你指定了 HIGH_PRIORITY 修饰符,它会覆盖掉服务器启动时的 --low-priority-updates 选项。与LOW_PRIORITY 一样 HIGH_PRIORITY 修饰符影响那些只支持表级锁的存储引擎,比如: MyISAM, MEMORY, 和 MERGE;
- IGNORE: 如果你指定了 IGNORE 修饰符,MySQL 服务器会在执行 INSERT 操作期间忽略那些可忽略的错误(可以忽略插入重复的数据)。这些错误最终会作为 WARNING 返回;
- DELAYED: 这个修饰符已经在 MySQL 5.6 版本中弃用,将来会被删除。在 MySQL 8.0 中,这个修饰符可用但会被忽略。
修饰符的用法如下:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
INTO table_name
...
使用 INSERT SELECT 语句
INSERT
也可以将一条 SELECT
语句的结果插入到表中。
INSERT INTO table_name [(column1, column2,...)]
SELECT column1, column2, ...
FROM source_table [WHERE condition];
语句说明:① 增加表中列的数目要与查询表中列的数目一致,列的类型也要相同;② 查询的表可以通过 WHERE
子句进行过滤;③ SELECT
的第一个列,对应着增加的第一个列,以此类推。
举例:
INSERT INTO `user` ( `name`, age )
SELECT `user`.`name`, `user`.age
FROM `user`
WHERE age > 18
---
Query OK, 2 rows affected (0.00 sec)
我们可以通过以下 SQL 查询 user
表的数据,以验证是否成功插入:
SELECT * FROM user;
DML语句:REPLACE
在 MySQL 中,如果你想向表中插入数据,除了使用 INSERT 语句,还可以使用 REPLACE 语句。
REPLACE 语句和 INSERT 语句很像,它们的不同之处在于,当插入过程中出现了重复的主键或者重复的唯一索引的时候,INSERT 语句会产生一个错误,而 REPLACE 语句则先删除旧的行,再插入新的行。
REPLACE 语句不在标准 SQL 的范畴。
我们可以使用一个 REPLACE
语句插入一行或多行数据 REPLACE
语句的语法如下
REPLACE [INTO] table_name (column_1, column_2, ...)
VALUES (value_11, value_12, ...),
(value_21, value_22, ...)
...;
说明:① REPLACE INTO 和 VALUES 都是关键字。INTO 可省略;② REPLACE INTO 后跟表名 table_name;③ 表名 table_name 后跟要插入数据的列名列表。列名放在小括号中,多个列表使用逗号分隔;④ VALUES 关键字之后的小括号中是值列表。值的数量要和字段的数量相同。值的位置和列的位置一一对应; ⑤ 当插入多行数据时,多个值列表之间使用逗号分隔。
REPLACE 语句与 INSERT 语句类似。REPLACE
语句还可以使用 SET
关键词,这只适用于操作单行。语法如下:
REPLACE [INTO] table_name
SET column1 = value1,
column2 = value2,
...;
这种用法与 UPDATE 语句的相似,但也是不同的。 UPDATE 只更新符合条件的行的指定字段的值,未指定的字段保留原值。REPLACE 则会删掉旧行,再插入新行,REPLACE 语句中未指定的字段则为默认值或者 NULL。
如果想要正常使用 REPLACE,当前操作的用户必须对表具有 INSERT 和 DELETE 权限。
数据更新
DML语句:UPDATE
UPDATE
语句可以更新表中的一行或者多行数据,可以更新表中的一个或者多个字段(列)。
以下是 UPDATE
语句的基本语法:
UPDATE [IGNORE] table_name
SET
column_name1 = value1,
column_name2 = value2,
...
[WHERE clause];
语句说明:① UPDATE 关键字后指定要更新数据的表名;② 使用 SET 子句设置字段的新值。多个字段使用逗号分隔。字段的值可以是普通的字面值,也可以是表达式运算,还可以是子查询;③ 使用 WHERE 子句指定要更新的行。只有符合 WHERE 条件的行才会被更新;④ WHERE 子句是可选的。如果不指定 WHERE 子句,则更新表中的所有行。
使用 UPDATE 修改数据
在以下实例中,我们使用 Sakila 示例数据库中的 customer 表进行演示。
在这个例子中,我们将把 customer_id 等于 1 的客户的电子邮件修改为 [email protected] g
使用以下 SELECT
语句查看更新前的数据:
SELECT first_name, last_name, email
FROM customer
WHERE customer_id = 1;
使用以下 UPDATE
语句更新 email
字段的值:
UPDATE customer
SET email = '[email protected]' # 通过 SET 子句将列的值设置为新电子邮件
WHERE customer_id = 1; # 通过 WHERE 子句指定更新的条件为 customer_id = 1
---
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
使用以下 SELECT
语句查看更新后的数据,以验证是否更新成功:
SELECT first_name, last_name, email
FROM customer
WHERE customer_id = 1;
使用 UPDATE 表达式更新
使用 UPDATE
更新时,字段的值可以设置为表达式的运算结果,比如函数或其他的运算。
下面的 UPDATE
更新所有客户的电子邮件的域名部分:
UPDATE customer
SET email = REPLACE(email, 'sakilacustomer.org', 'sjkjc.com'); # 字符串替换操作
---
Query OK, 599 rows affected (0.03 sec)
Rows matched: 599 Changed: 599 Warnings: 0
注意,本例中没有使用 WHERE
子句,所以表中所有的数据都进行了更新
使用 UPDATE 子查询更新
下面实例展示了如何为没有绑定商店的客户绑定一个随机商店。
UPDATE customer
SET store_id = (
SELECT store_id
FROM store
ORDER BY RAND()
LIMIT 1
)
WHERE store_id IS NULL;
在本例中,我们通过以下 SELECT
语句返回一个随机的商店 id:
SELECT store_id
FROM store
ORDER BY RAND()
LIMIT 1
在 SET
子句中,将 store_id
的值设置为上面的子查询。
使用 UPDATE 修饰符
在 MySQL 中, UPDATE 语句支持 2 个修饰符:
-
LOW_PRIORITY: 如果你指定了 LOW_PRIORITY 修饰符,MySQL 服务器将延迟执行 UPDATE 操作直到没有客户端对表进行读操作。LOW_PRIORITY 修饰符影响那些只支持表级锁的存储引擎,比如: MyISAM, MEMORY, 和 MERGE;
-
IGNORE: 如果你指定了 IGNORE 修饰符,MySQL 服务器会在执行 UPDATE 操作期间忽略那些可忽略的错误。这些错误最终会作为 WARNING 返回。
修饰符的用法如下:
UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name = value
删除数据
DML语句:DELETE
在 MySQL 中,DELETE
语句用于从表中删除满足条件的记录行。
DELETE
语句单表删除语法如下:
DELETE FROM table_name
[WHERE clause]
[ORDER BY ...]
[LIMIT row_count]
说明:① DELETE FROM 后跟的是要从中删除数据的表 ② WHERE 子句用来过滤需要删除的行。满足条件的行会被删除;③ WHERE 子句是可选的。没有 WHERE 子句时,DELETE 语句将删除表中的所有行;④ ORDER BY 子句用来指定删除行的顺序。它是可选的;⑤ LIMIT 子句用来指定删除的最大行数。它是可选的;⑥ DELETE` 语句返回删除的行数。
使用 DELETE 删除数据
在以下实例中,我们使用 Sakila 示例数据库中的 actor 表 进行演示。
请注意,一旦使用 DELETE 语句删除了数据,数据就会消失。请谨慎操作。
为了防止数据丢失,我们通过以下 SQL 创建一个表 actor_copy 做为 actor 表的拷贝。如下
CREATE TABLE actor_copy AS (SELECT * FROM actor);
---
Query OK, 201 rows affected (0.01 sec)
Records: 201 Duplicates: 0 Warnings: 0
下面开始我们的实例,开始之前我们先通过 COUNT
函数查询一下,表中数据数目:
SELECT COUNT(*) FROM actor_copy;
删除 actor_id
等于 1
的行:
DELETE FROM actor_copy WHERE actor_id = 1;
---
Query OK, 1 row affected (0.00 sec)
删除 last_name
等于 KILMER
的行:
DELETE FROM actor_copy WHERE last_name = 'KILMER';
---
Query OK, 5 rows affected (0.01 sec)
再次确认表中数据数目:
SELECT COUNT(*) FROM actor_copy;
使用 DELETE 删除数据时限制数量
考虑这些需求:① 删除排名最靠后的 5 个成绩;② 删除最新注册的 10 名用户。
这时,我们可以结合使用 ORDER BY
和 LIMIT
子句。
以下语句用来删除 actor_copy
中 actor_id
最大的 10 行:
DELETE FROM actor_copy
ORDER BY actor_id DESC
LIMIT 10;
---
Query OK, 10 rows affected (0.01 sec)
如果单独使用 LIMIT
子句,删除的顺序是不明确的。大多数情况下, DELETE
语句中的 LIMIT
子句都应该和 ORDER BY
子句一起使用。
使用 DELETE 删除表中所有的行
如果我们不在 DELETE
语句中使用 WHERE
或者 LIMIT
子句,则会删除表中的所有行。
DELETE FROM actor_copy;
---
Query OK, 194 rows affected (0.00 sec)
我们通过以下语句检查表中是否还有数据行:
SELECT COUNT(*) FROM actor_copy;
此时, actor_copy
表已经空了。
如果你只是想清空表,可以使用 TRUNCATE TABLE
语句以获得更好的性能。如下:
TRUNCATE actor_copy;
使用 DELETE 表别名删除
在早期的 MySQL 版本中, 单表删除 DELETE 语句不支持为表设置别名。比如:
DELETE FROM main_table m
WHERE NOT EXISTS (
SELECT *
FROM another_table a
WHERE a.main_id = m.id
);
将会产生错误:Error Code: 1064. 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 't' at line 1 0.016 sec。
可以改成如下语句:
DELETE m FROM main_table m
WHERE NOT EXISTS (
SELECT *
FROM another_table a
WHERE a.main_id = m.id
);
或者不使用别名,而是使用表名:
DELETE FROM main_table
WHERE NOT EXISTS (
SELECT *
FROM another_table a
WHERE a.main_id = main_table.id
);
使用 DELETE 多表删除
我们也可以在一个 DELETE
语句中指定多个表,以便在一个或多个表中删除符合 WHERE
子句中的条件的行。
以下语句删除 t1
和 t2
表中满足条件的行:
DELETE t1, t2
FROM t1 INNER JOIN t2
WHERE t1.id = t2.id;
以下语句删除 t1
表中满足条件的行:
DELETE t1
FROM t1 INNER JOIN t2
WHERE t1.id = t2.id;
以下语句在删除时使用 LEFT JOIN
:
DELETE t1
FROM
t1 LEFT JOIN t2 ON t1.id = t2.id
WHERE t2.id IS NULL;
只要是 SELECT
语句中允许使用的 JOIN
类型,多表删除语句都可以使用。
多表删除语句中不能使用 LIMIT
子句和 ORDER BY
子句。
使用 DELETE 修饰符
在 MySQL 中, DELETE 语句支持 3 个修饰符:
-
LOW_PRIORITY: 如果你指定了 LOW_PRIORITY 修饰符,MySQL 服务器将延迟执行 DELETE 操作直到没有客户端对表进行读操作。这个修饰符影响那些只支持表级锁的存储引擎,比如: MyISAM, MEMORY, 和 MERGE;
-
QUICK: 如果你指定了 QUICK 修饰符,MyISAM 存储引擎不会在 DELETE 操作期间合并索引。这在某种程度上会加快 DELETE 操作;
-
IGNORE: 如果你指定了 IGNORE 修饰符,MySQL 服务器会在执行 DELETE 操作期间忽略那些可忽略的错误。这些错误最终会作为 WARNING 返回。
修饰符的用法如下:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name
标签:语句,name,MySQL,TABLE,操作,table,id,DELETE
From: https://www.cnblogs.com/clswhde/p/18370034