insert [into] table_name [属性] values (数据)
--建立一个学生表
mysql> create table student(
->id int unsigned primary key auto_increment,
->sn int not null unique comment '学号',
->name varchar(20) not null comment '姓名',
->qq varchar(20)
->);
//数据的数量和数据类型必须和插入表的列的数量和顺序一致
mysql> insert into student values (100,10000,'唐三藏',NULL);
mysql> insert into student values (101,10001,'孙悟空','111111');
mysql> select * from student;
+-----+-------+-----------+--------+
| id | sn | name | qq |
+-----+-------+-----------+--------+
| 100 | 10000 | 唐三藏 | NULL |
| 101 | 10001 | 孙悟空 | 111111 |
+-----+-------+-----------+--------+
mysql> insert into student (id,sn,name) values (102,20001,'曹孟德'),(103,20002,'孙仲谋');
mysql> select * from student;
+-----+-------+-----------+--------+
| id | sn | name | qq |
+-----+-------+-----------+--------+
| 100 | 10000 | 唐三藏 | NULL |
| 101 | 10001 | 孙悟空 | 111111 |
| 102 | 20001 | 曹孟德 | NULL |
| 103 | 20002 | 孙仲谋 | NULL |
+-----+-------+-----------+--------+
插入的数据可能由于主键或者唯一键的唯一性冲突,导致数据插入失败
可以选择性的进行同步更新操作语法:
insert ... on duplicate key update 属性=数据...
//原先数据
mysql> select * from student;
+-----+-------+-----------+--------+
| id | sn | name | qq |
+-----+-------+-----------+--------+
| 100 | 10000 | 唐三藏 | NULL |
| 101 | 10001 | 孙悟空 | 111111 |
| 102 | 20001 | 曹孟德 | NULL |
| 103 | 20002 | 孙仲谋 | NULL |
+-----+-------+-----------+--------+
mysql> insert into student (id,sn,name) values (100,10003,'刘玄德') on duplicate key update id=104,sn=10003,name='刘玄德';
Query OK, 2 rows affected (0.00 sec)
mysql> select * from student;
+-----+-------+-----------+--------+
| id | sn | name | qq |
+-----+-------+-----------+--------+
| 101 | 10001 | 孙悟空 | 111111 |
| 102 | 20001 | 曹孟德 | NULL |
| 103 | 20002 | 孙仲谋 | NULL |
| 104 | 10003 | 刘玄德 | NULL |
+-----+-------+-----------+--------+
原先插入的数据,id是冲突的,如果出现冲突,那么就按照update后的数据修改
表原先数据
update后MySQL返回的结果也有不同的表示
0 row affected
:表中有冲突数据,但update后的数据任然有冲突,无法插入
1 row affected
:表中没有冲突,数据被插入
2 row affected
:表中有冲突数据,并且数据已经被更新
可以通过MySQL函数获取受影响的数据行数
mysql> select row_count();
+-------------+
| row_count() |
+-------------+
| 2 |
+-------------+
主键 或者 唯一键 没有冲突,直接插入
主键 或者 唯一键 有冲突,删除原先数据再插入
mysql> select * from student;
+-----+-------+-----------+--------+
| id | sn | name | qq |
+-----+-------+-----------+--------+
| 101 | 10001 | 孙悟空 | 111111 |
| 102 | 20001 | 曹孟德 | NULL |
| 103 | 20002 | 孙仲谋 | NULL |
| 104 | 10003 | 刘玄德 | NULL |
+-----+-------+-----------+--------+
mysql> replace into student (sn,name) values (20002,'赵子龙');
mysql> select * from student;
+-----+-------+-----------+--------+
| id | sn | name | qq |
+-----+-------+-----------+--------+
| 101 | 10001 | 孙悟空 | 111111 |
| 102 | 20001 | 曹孟德 | NULL |
| 104 | 10003 | 刘玄德 | NULL |
| 105 | 20002 | 赵子龙 | NULL |
+-----+-------+-----------+--------+
1 row affected
:表中没有冲突数据,数据被插入
2 row affected
:表中有冲突数据,删除后重新插入
update和replace就在于,update是修改表数据,
没有改变自增长的值
而replace是删除原先数据,再插入新数据,所以自增长的值会改变