表示数据库的主要操作对象,今天介绍关于表的增删改。
- 增加: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(), age int);
Query OK, rows affected ( sec)
mysql> insert into t2 values(, 'xucc', );
Query OK, row affected ( sec)
-- 插入主键值存在的列,报错
mysql> insert into t2 values(, 'zhangsan', );
ERROR (): 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删除
与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删除不能指定条件,一般用于表的整体删除,速度比delete整体删除要快。
truncate会将表记录也删除掉,例如自增长数据。使用delete删除自增长数据,下次自增长数据添加还会从删除的值开始增加,而truncate却将其彻底删除,下次添加从默认值开始。
truncate删除完毕不会返回删除的数据数,而delete会返回删除的数据数。
要注意,不管是delete还是truncate只是删除表的数据,并没有删除表结构,删除表结构使用drop。