MySQL从零开始 8-表数据的增删查改:insert, update, delete, truncate

表示数据库的主要操作对象,今天介绍关于表的增删改。

  • 增加:insert
  • 修改:update
  • 删除:delete/truncate

1. insert增加

 insert语法如下

insert into tableName(colName name1, colName name2, ...) values(value1, value2, ...);

 在插入数据时,我们可以指定插入的列,在tableName后括号内指定要插入列的列名,然后在values后的括号内指定相应的值。

 注意,指定列和之后的数据顺序要一一对应。

 如果不指定要插入的列,则隐式表明全部插入。

 看下面的例子。

-- 创建表
mysql> create table t1(id int, name  varchar(32));
Query OK, 0 rows affected (0.52 sec)

-- 指定name列进行插入
mysql> insert into t1(name) values('xucc');
Query OK, 1 row affected (0.53 sec)

mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
| NULL | xucc |
+------+------+
1 row in set (0.00 sec)

-- 指定id列进行插入
mysql> insert into t1(id) values(1);
Query OK, 1 row affected (0.28 sec)

mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
| NULL | xucc |
|    1 | NULL |
+------+------+
2 rows in set (0.00 sec)

-- 向id列插入name,报错
mysql> insert into t1(id) values('zhangsan');
ERROR 1366 (HY000): Incorrect integer value: 'zhangsan' for column 'id' at row 1

-- 不指定列,全部插入
mysql> insert into t1 values(3, 'lisi');
Query OK, 1 row affected (0.06 sec)

mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
| NULL | xucc |
|    1 | NULL |
|    3 | lisi |
+------+------+
3 rows in set (0.00 sec)

 在插入数据的时候,有时候我们会对主键所在列进行插入,假设逐渐对应的值已经存在,就会插入失败。

-- id列为主键
mysql> create table t2(id int primary key, name varchar(32), age int);
Query OK, 0 rows affected (0.35 sec)

mysql> insert into t2 values(1, 'xucc', 10);
Query OK, 1 row affected (0.10 sec)

-- 插入主键值存在的列,报错
mysql> insert into t2 values(1, 'zhangsan', 11);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

 这是就要使用如下方法:

  • a. 更新操作

 语法如下:

insert into tableName(colName1, ...) values(value1, ...) on duplicate key update colName1=value1, ... ;

 当发生主键冲突时,就会将update关键字后的操作进行执行。

mysql> insert into t2 values(1, 'zhangsan', 11) on duplicate key update id=1, name='zahngsan';
Query OK, 2 rows affected (0.09 sec)

mysql> select * from t2;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | zahngsan |   10 |
+----+----------+------+
1 row in set (0.00 sec)
  • b. 替换操作

 使用replace进行数据插入,如果发生主键冲突,直接替换,如果没发生主键冲突,正常数据插入。

replace into tableName(colName1, ...) values(value1, ...);

 使用如下:

mysql> replace into t2 values(1, 'lisi', 12);
Query OK, 2 rows affected (0.26 sec)

mysql> select * from t2;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | lisi |   12 |
+----+------+------+
1 row in set (0.00 sec)

2. update修改

 update又称更新,语法如下:

update tableName set colName1=value1[, ...] [where condition];

 uodate将set关键字后的列修改成等号后面的值,可以有多列,where后面跟的是update的条件,即修改的列的限制条件,如果不加限制条件,就会将表中该列所有数据进行修改。

 在进行update的使用之前,我们想创造一张表。

mysql> create table t3(
    ->   id int,
    ->   name varchar(32),
    ->   price float
    -> );
Query OK, 0 rows affected (0.34 sec)

mysql> insert into t3 values(1, '苹果', 5.3),(2, '香蕉', 4.1), (3, '橘子', 7.12), (4, '芒果', 2.2);
Query OK, 4 rows affected (0.11 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from t3;
+------+------+-------+
| id   | name | price |
+------+------+-------+
|    1 | 苹果 |   5.3 |
|    2 | 香蕉 |   4.1 |
|    3 | 橘子 |  7.12 |
|    4 | 芒果 |   2.2 |
+------+------+-------+
4 rows in set (0.01 sec)

 update使用如下:

-- 将所有水果价钱加10
mysql> update t3 set price=price+10;
Query OK, 4 rows affected (0.09 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> select * from t3;
+------+------+-------+
| id   | name | price |
+------+------+-------+
|    1 | 苹果 |  15.3 |
|    2 | 香蕉 |  14.1 |
|    3 | 橘子 | 17.12 |
|    4 | 芒果 |  12.2 |
+------+------+-------+
4 rows in set (0.00 sec)

-- 将所有id为偶数的水果价格定为20
mysql> update t3 set price=20 where id%2=0;
Query OK, 2 rows affected (0.58 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from t3;
+------+------+-------+
| id   | name | price |
+------+------+-------+
|    1 | 苹果 |  15.3 |
|    2 | 香蕉 |    20 |
|    3 | 橘子 | 17.12 |
|    4 | 芒果 |    20 |
+------+------+-------+
4 rows in set (0.00 sec)

 还可以将limit与update配合使用表示限制更新数量,语法如下:

update tableName set colName=value [...] [where condition] limit 更新数量;

 使用如下:

-- 将前两行数据id加10
mysql> update t3 set id=id+10 limit 2;
Query OK, 2 rows affected (0.07 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from t3;
+------+------+-------+
| id   | name | price |
+------+------+-------+
|   11 | 苹果 |  15.3 |
|   12 | 香蕉 |    20 |
|    3 | 橘子 | 17.12 |
|    4 | 芒果 |    20 |
+------+------+-------+
4 rows in set (0.00 sec)

3. delete/truncate删除

delete from tableName [where condition];

 与update相似,如果不指定条件,delete会删除整张表,反之,会删除指定条件的行。

 在进行演示之前,我们先应该对t3表做一个拷贝,以防数据丢失,毕竟,删除操作在数据库里是一个高风险操作。

-- 创建副本tmp,结构与t3一样
mysql> create table tmp like t3;
Query OK, 0 rows affected (0.53 sec)

-- 将t3数据全部插入tmp中
mysql> insert into tmp select * from t3;
Query OK, 4 rows affected (0.07 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from tmp;
+------+------+-------+
| id   | name | price |
+------+------+-------+
|   11 | 苹果 |  15.3 |
|   12 | 香蕉 |    20 |
|    3 | 橘子 | 17.12 |
|    4 | 芒果 |    20 |
+------+------+-------+
4 rows in set (0.02 sec)

 接下来进行删除操作。

mysql> delete from tmp where id=11;
Query OK, 1 row affected (0.18 sec)

mysql> select * from tmp;
+------+------+-------+
| id   | name | price |
+------+------+-------+
|   12 | 香蕉 |    20 |
|    3 | 橘子 | 17.12 |
|    4 | 芒果 |    20 |
+------+------+-------+
3 rows in set (0.00 sec)

-- 不指定条件,删除整张表
mysql> delete from tmp;
Query OK, 3 rows affected (0.09 sec)

mysql> select * from tmp;
Empty set (0.00 sec)

 MySQL提供了零一个关键字truncate也用于删除,它的语法如下:

truncate table tableName

 truncate删除不能指定条件,一般用于表的整体删除,速度比delete整体删除要快。

 truncate会将表记录也删除掉,例如自增长数据。使用delete删除自增长数据,下次自增长数据添加还会从删除的值开始增加,而truncate却将其彻底删除,下次添加从默认值开始。

 truncate删除完毕不会返回删除的数据数,而delete会返回删除的数据数。

 要注意,不管是delete还是truncate只是删除表的数据,并没有删除表结构,删除表结构使用drop。

猜你喜欢

转载自blog.csdn.net/weixin_40739833/article/details/80711374