DML:
INSERT UPDATE DELETE
INSERT语句
功能 一次插入一行或多行数据
语法
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
实例:插入数据
-- 插入多条数据
16:50:45 (root@(none)) [db1]> select * from student;
+----+----------+-----+--------+
| id | name | age | gender |
+----+----------+-----+--------+
| 10 | xiaoming | 20 | M |
| 11 | xiaohong | 18 | F |
+----+----------+-----+--------+
2 rows in set
Time: 0.009s
16:55:22 (root@(none)) [db1]> insert into student (name,age,gender) values ('xiaolan',17,'m'),('xiaolv',22,'f');
Query OK, 2 rows affected
Time: 0.065s
16:55:26 (root@(none)) [db1]> select * from student;
+----+----------+-----+--------+
| id | name | age | gender |
+----+----------+-----+--------+
| 10 | xiaoming | 20 | M |
| 11 | xiaohong | 18 | F |
| 12 | xiaolan | 17 | M |
| 13 | xiaolv | 22 | F |
+----+----------+-----+--------+
4 rows in set
Time: 0.008s
-- 从现有表(student)中批量添加数据到新表(teacher)中
17:10:30 (root@(none)) [db1]> select * from teacher;
+----+------+-----+--------+
| id | name | age | gender |
+----+------+-----+--------+
0 rows in set
Time: 0.009s
17:10:56 (root@(none)) [db1]> insert into teacher select * from student;
Query OK, 4 rows affected
Time: 0.051s
17:10:58 (root@(none)) [db1]> select * from teacher;
+----+----------+-----+--------+
| id | name | age | gender |
+----+----------+-----+--------+
| 10 | xiaoming | 20 | M |
| 11 | xiaohong | 18 | F |
| 12 | xiaolan | 17 | M |
| 13 | xiaolv | 22 | F |
+----+----------+-----+--------+
4 rows in set
Time: 0.009s
UPDATE语句
语法
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
注意⚠️: 一定要限制条件,否则将修改字段名内所有匹配行的数据
可使用mysql
选项避免此错误发生
-- 方法一:直接在mysql命令行添加参数
mysql -U|--safe-updates| --i-am-a-dummy Only allow UPDATE and DELETE that uses keys.
-- 方法二:在my.cnf的配置文件中修改
vim /etc/my.cnf
[mysql]
safe-updates
17:31:41 (root@localhost) [db1]> update teacher set age=18;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.
-- 方法三: 登录到数据库中修改sql_safe_updates选项
17:54:23 (root@(none)) [(none)]> show variables like 'sql_safe_updates';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| sql_safe_updates | OFF |
+------------------+-------+
1 row in set
Time: 0.018s
17:54:28 (root@(none)) [(none)]> set sql_safe_updates= ON;
Query OK, 0 rows affected
Time: 0.001s
17:54:29 (root@(none)) [(none)]> show variables like 'sql_safe_updates';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| sql_safe_updates | ON |
+------------------+-------+
1 row in set
Time: 0.010s
17:54:30 (root@(none)) [(none)]>
17:54:30 (root@(none)) [(none)]>
17:54:30 (root@(none)) [(none)]>
17:54:35 (root@(none)) [(none)]> use db1;
You are now connected to database "db1" as user "root"
Time: 0.001s
17:54:40 (root@(none)) [db1]> select * from teacher;
+----+----------+-----+--------+
| id | name | age | gender |
+----+----------+-----+--------+
| 10 | xiaoming | 20 | M |
| 11 | xiaohong | 36 | M |
| 12 | xiaolan | 17 | M |
| 13 | xiaolv | 22 | F |
+----+----------+-----+--------+
4 rows in set
Time: 0.012s
17:54:46 (root@(none)) [db1]> update teacher set age=22;
-- You're about to run a destructive command.
-- Do you want to proceed? (y/n): y
-- Your call!
(1175, 'You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. ')
17:55:13 (root@(none)) [db1]> select * from teacher;
+----+----------+-----+--------+
| id | name | age | gender |
+----+----------+-----+--------+
| 10 | xiaoming | 20 | M |
| 11 | xiaohong | 36 | M |
| 12 | xiaolan | 17 | M |
| 13 | xiaolv | 22 | F |
+----+----------+-----+--------+
4 rows in set
Time: 0.009s
实例:修改多个数据
-- 修改teacher表中xiaohong的age为36,gender为M
17:19:21 (root@(none)) [db1]> select * from teacher;
+----+----------+-----+--------+
| id | name | age | gender |
+----+----------+-----+--------+
| 10 | xiaoming | 20 | M |
| 11 | xiaohong | 18 | F |
| 12 | xiaolan | 17 | M |
| 13 | xiaolv | 22 | F |
+----+----------+-----+--------+
4 rows in set
Time: 0.008s
17:19:34 (root@(none)) [db1]> update teacher set age=36,gender='M' where name='xiaohong';
Query OK, 1 row affected
Time: 0.015s
17:19:37 (root@(none)) [db1]> select * from teacher;
+----+----------+-----+--------+
| id | name | age | gender |
+----+----------+-----+--------+
| 10 | xiaoming | 20 | M |
| 11 | xiaohong | 36 | M |
| 12 | xiaolan | 17 | M |
| 13 | xiaolv | 22 | F |
+----+----------+-----+--------+
4 rows in set
Time: 0.008s
DELETE语句
删除表中数据,但不会自动缩减数据文件大小
语法
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
注意⚠️: 一定要限制条件,否则将清空表中所有数据
如果想清空表,保留表结构,也可以使用下面的语句,此语句会自动缩减数据文件的大小
TRUNCATE [TABLE] tbl_name
优化表空间
OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ...
实例:
-- 删除id为13的数据信息
10:23:35 (root@(none)) [db1]> select * from teacher;
+----+----------+-----+--------+
| id | name | age | gender |
+----+----------+-----+--------+
| 10 | xiaoming | 20 | M |
| 11 | xiaohong | 36 | M |
| 12 | xiaolan | 17 | M |
| 13 | xiaolv | 22 | F |
+----+----------+-----+--------+
4 rows in set
Time: 0.008s
10:24:24 (root@(none)) [db1]> delete from teacher where id = 13;
-- You're about to run a destructive command.
-- Do you want to proceed? (y/n): y
-- Your call!
Query OK, 1 row affected
Time: 0.079s
10:24:28 (root@(none)) [db1]> select * from teacher;
+----+----------+-----+--------+
| id | name | age | gender |
+----+----------+-----+--------+
| 10 | xiaoming | 20 | M |
| 11 | xiaohong | 36 | M |
| 12 | xiaolan | 17 | M |
+----+----------+-----+--------+
3 rows in set
Time: 0.009s
-- 清空表内容
10:27:02 (root@(none)) [db1]> select * from teacher;
+----+----------+-----+--------+
| id | name | age | gender |
+----+----------+-----+--------+
| 10 | xiaoming | 20 | M |
| 11 | xiaohong | 36 | M |
| 12 | xiaolan | 17 | M |
+----+----------+-----+--------+
3 rows in set
Time: 0.008s
10:27:14 (root@(none)) [db1]> delete from teacher;
-- You're about to run a destructive command.
-- Do you want to proceed? (y/n): y
-- Your call!
Query OK, 3 rows affected
Time: 0.019s
10:27:19 (root@(none)) [db1]> select * from teacher;
+----+------+-----+--------+
| id | name | age | gender |
+----+------+-----+--------+
0 rows in set
Time: 0.008s
-- 清空表的另一种用法,这种方法可以缩减数据文件的大小
10:28:05 (root@(none)) [db1]> select * from teacher;
+----+----------+-----+--------+
| id | name | age | gender |
+----+----------+-----+--------+
| 10 | xiaoming | 20 | M |
| 11 | xiaohong | 18 | F |
| 12 | xiaolan | 17 | M |
| 13 | xiaolv | 22 | F |
+----+----------+-----+--------+
4 rows in set
Time: 0.008s
10:28:22 (root@(none)) [db1]> truncate table teacher;
-- You're about to run a destructive command.
-- Do you want to proceed? (y/n): y
-- Your call!
Query OK, 0 rows affected
Time: 0.092s
10:28:28 (root@(none)) [db1]> select * from teacher;
+----+------+-----+--------+
| id | name | age | gender |
+----+------+-----+--------+
0 rows in set
Time: 0.009s
-- 防止勿清空表的安全策略选项
10:30:18 (root@(none)) [db1]> show variables like 'sql_safe_updates';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| sql_safe_updates | OFF |
+------------------+-------+
1 row in set
Time: 0.011s
10:30:22 (root@(none)) [db1]> set sql_safe_updates=1;
Query OK, 0 rows affected
Time: 0.001s
10:30:24 (root@(none)) [db1]> show variables like 'sql_safe_updates';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| sql_safe_updates | ON |
+------------------+-------+
1 row in set
Time: 0.010s
10:30:51 (root@(none)) [db1]> insert into teacher select * from student;
Query OK, 4 rows affected
Time: 0.005s
10:30:53 (root@(none)) [db1]> select * from teacher;
+----+----------+-----+--------+
| id | name | age | gender |
+----+----------+-----+--------+
| 10 | xiaoming | 20 | M |
| 11 | xiaohong | 18 | F |
| 12 | xiaolan | 17 | M |
| 13 | xiaolv | 22 | F |
+----+----------+-----+--------+
4 rows in set
Time: 0.009s
10:30:58 (root@(none)) [db1]> delete from teacher;
-- You're about to run a destructive command.
-- Do you want to proceed? (y/n): y
-- Your call!
(1175, 'You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. ')
实例:使用delete语句清空表,查看数据文件大小
-- 使用delete语句清空表后,数据文件是否减小
-- 在db1的数据库中,创建了一个testlog的表,并查看testlog数据文件的大小
11:26:35 (root@(none)) [db1]> create table testlog (id int auto_increment primary key,name char(100),age int default 20);
->
-> delimiter $$
->
-> create procedure sp_testlog()
-> begin
-> declare i int;
-> set i = 1;
-> while i <= 100000
-> do insert into testlog(name,age) values (concat('hooper',i),i);
-> set i = i +1;
-> end while;
-> end$$
->
-> delimiter ;
Query OK, 0 rows affected
Time: 0.164s
Changed delimiter to $$
Time: 0.000s
Query OK, 0 rows affected
Time: 0.008s
Changed delimiter to ;
Time: 0.000s
-- 刚创建完成的表中没有数据,数据文件大小为96K
[root@magedu ~]# du -shc /data/mysql/data/db1/testlog.ibd
96K /data/mysql/data/db1/testlog.ibd
96K total
-- 执行插入数据的脚本,并查看数据文件的大小
11:44:47 (root@(none)) [db1]> call sp_testlog;
Query OK, 1 row affected
Time: 775.133s
-- 实时查看数据文件的大小
[root@magedu ~]# du -shc /data/mysql/data/db1/testlog.ibd
272K /data/mysql/data/db1/testlog.ibd
272K total
[root@magedu ~]# du -shc /data/mysql/data/db1/testlog.ibd
288K /data/mysql/data/db1/testlog.ibd
288K total
[root@magedu ~]# du -shc /data/mysql/data/db1/testlog.ibd
9.0M /data/mysql/data/db1/testlog.ibd
9.0M total
[root@magedu ~]# du -shc /data/mysql/data/db1/testlog.ibd
11M /data/mysql/data/db1/testlog.ibd
11M total
.....................
[root@magedu ~]# du -shc /data/mysql/data/db1/testlog.ibd
19M /data/mysql/data/db1/testlog.ibd
19M total
[root@magedu ~]# du -shc /data/mysql/data/db1/testlog.ibd
21M /data/mysql/data/db1/testlog.ibd
21M total
-- 删除存储脚本
12:01:23 (root@(none)) [db1]> drop procedure if exists sp_testlog;
-- You're about to run a destructive command.
-- Do you want to proceed? (y/n): y
-- Your call!
Query OK, 0 rows affected
Time: 0.029s
-- 备份testlog到testlogbak
12:05:03 (root@(none)) [db1]> create table testlogbak like testlog;
Query OK, 0 rows affected
Time: 0.154s
12:05:16 (root@(none)) [db1]> desc testlogbak;
+-------+-----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | <null> | auto_increment |
| name | char(100) | YES | | <null> | |
| age | int(11) | YES | | 20 | |
+-------+-----------+------+-----+---------+----------------+
3 rows in set
Time: 0.009s
12:05:22 (root@(none)) [db1]> select * from testlogbak;
+----+------+-----+
| id | name | age |
+----+------+-----+
0 rows in set
Time: 0.009s
12:05:59 (root@(none)) [db1]> insert into testlogbak select * from testlog;
Query OK, 100000 rows affected
Time: 2.649s
12:06:27 (root@(none)) [db1]> select * from testlogbak where id = 99999;
+-------+-------------+-------+
| id | name | age |
+-------+-------------+-------+
| 99999 | hooper99999 | 99999 |
+-------+-------------+-------+
1 row in set
Time: 0.009s
12:06:35 (root@(none)) [db1]> select * from testlogbak where id = 100000;
+--------+--------------+--------+
| id | name | age |
+--------+--------------+--------+
| 100000 | hooper100000 | 100000 |
+--------+--------------+--------+
1 row in set
Time: 0.009s
-- 使用delete语句,清空表,并查看数据文件的大小
12:08:53 (root@(none)) [db1]> delete from testlog;
-- You're about to run a destructive command.
-- Do you want to proceed? (y/n): y
-- Your call!
Query OK, 100000 rows affected
Time: 0.369s
12:09:21 (root@(none)) [db1]> select * from testlog;
+----+------+-----+
| id | name | age |
+----+------+-----+
0 rows in set
Time: 0.008s
[root@magedu ~]# du -shc /data/mysql/data/db1/testlog.ibd
21M /data/mysql/data/db1/testlog.ibd
21M total
-- 使用OPTIMIZE语句优化表空间,数据文件的大小
12:11:01 (root@(none)) [db1]> optimize table testlog;
+-------------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+-------------+----------+----------+-------------------------------------------------------------------+
| db1.testlog | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| db1.testlog | optimize | status | OK |
+-------------+----------+----------+-------------------------------------------------------------------+
2 rows in set
Time: 0.146s
-- 再次查看数据文件大小
[root@magedu ~]# du -shc /data/mysql/data/db1/testlog.ibd
96K /data/mysql/data/db1/testlog.ibd
96K total
实例:使用truncate语句清空表,并查看数据文件的大小
-- 从刚才的实例中备份的testlogbak表,并查看testlogbak的数据文件大小
12:12:46 (root@(none)) [db1]> select * from testlogbak where id = 100000;
+--------+--------------+--------+
| id | name | age |
+--------+--------------+--------+
| 100000 | hooper100000 | 100000 |
+--------+--------------+--------+
1 row in set
Time: 0.009s
[root@magedu ~]# du -shc /data/mysql/data/db1/testlogbak.ibd
21M /data/mysql/data/db1/testlogbak.ibd
21M total
-- 使用truncate语句,清空表,并查看数据文件的大小
12:16:47 (root@(none)) [db1]> truncate table testlogbak;
-- You're about to run a destructive command.
-- Do you want to proceed? (y/n): y
-- Your call!
Query OK, 0 rows affected
Time: 0.114s
[root@magedu ~]# du -shc /data/mysql/data/db1/testlogbak.ibd
96K /data/mysql/data/db1/testlogbak.ibd
96K total