📂 Create(创建/新增)
对于表内数据的创建无非就是对数据的插入;
INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ... value_list: value, [, value] ...
存在一张表为:
mysql> create table if not exists stu( -> id int(2) unsigned zerofill primary key comment'id并设置主键约束', -> sn int(5) unsigned zerofill not null unique comment'学号', -> name varchar(20) not null comment'姓名', -> email varchar(32) null comment'邮箱' -> ); Query OK, 0 rows affected (0.00 sec) mysql> desc stu; +-------+--------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------------------+------+-----+---------+-------+ | id | int(2) unsigned zerofill | NO | PRI | NULL | | | sn | int(5) unsigned zerofill | NO | UNI | NULL | | | name | varchar(20) | NO | | NULL | | | email | varchar(32) | YES | | NULL | | +-------+--------------------------+------+-----+---------+-------+
📌全列插入与指定列插入📌
以该表为例,若是需要为该表插入数据,插入数据的方式分为全列插入与指定列插入;
- 全列插入
全列插入指的是在插入数据时需要插入表中所有的字段;
即表中有几个字段就需要根据字段个数与字段要求插入对应的数据;
mysql> insert into stu values(1,1,'Lihua','123456@xx.com'); #全列插入 Query OK, 1 row affected (0.00 sec) mysql> select * from stu; +----+-------+-------+---------------+ | id | sn | name | email | +----+-------+-------+---------------+ | 01 | 00001 | Lihua | 123456@xx.com | +----+-------+-------+---------------+ 1 row in set (0.00 sec)
- 在默认的插入中使用的即为全列插入,在全列插入时
values
前不需要使用()
来指明需要插入 的字段,只需要在values
后使用()
按照字段顺序插入对应数据即可;
语法:
insert [into] table_name values (value_list) [, (value_list)] ...
- 其中带
[]
的为可省略; - 指定列插入
指定列插入,顾名思义是需要指定所插入的字段进行插入;
mysql> insert into stu (id,name,sn)value(2,'Zhangqian',2);#指定列插入 Query OK, 1 row affected (0.00 sec) mysql> select * from stu; +----+-------+-----------+---------------+ | id | sn | name | email | +----+-------+-----------+---------------+ | 01 | 00001 | Lihua | 123456@xx.com | | 02 | 00002 | Zhangqian | NULL | +----+-------+-----------+---------------+ 2 rows in set (0.00 sec)
- 如该段代码所示,这段代码演示了如何使用指定列插入,插入数据时在
values
前使用()
指定了需要插入数据的字段,在插入数据时根据所指定字段的顺序以及对应的要求对表进行数据的插入;
语法:
insert [into] table_name [(column [, column] ...)/*指定列*/]values (value_list) [, (value_list)] ...
📌单行数据插入与多行数据插入📌
无论是全列插入还是指定列插入都能进行对应的单行数据与多行数据插入;
这表示在MySQL中对于各种条件的混用是十分灵活的;
- 单行数据插入
单行数据插入即在解释全列插入与指定列插入所使用的数据插入;mysql> insert into stu values(1,1,'Lihua','123456@xx.com'); #单行数据插入
这个代码中为什么叫做单行数据插入?
在MySQL中我们将字段称之为列,对应的行即为对应的一组数据;
这里的values(1,1,'Lihua','123456@xx.com')
即为插入一行数据,该行数据根据对应的字段如上; - 多行数据插入
而要进行多行数据插入则可以直接使用,(value_list)
来对数据进行追加;
示例:(这里以全列插入为例,指定列插入不再作示范)
mysql> insert into stu values(3,3,'Liqiang','112233'),(4,4,'Zhangwu','223344'),(5,5,'Liuba','445566'); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from stu; +----+-------+-----------+---------------+ | id | sn | name | email | +----+-------+-----------+---------------+ | 01 | 00001 | Lihua | 123456@xx.com | | 02 | 00002 | Zhangqian | NULL | | 03 | 00003 | Liqiang | 112233 | | 04 | 00004 | Zhangwu | 223344 | | 05 | 00005 | Liuba | 445566 | +----+-------+-----------+---------------+ 5 rows in set (0.00 sec)
📌插入数据否则更新📌
INSERT ... ON DUPLICATE KEY UPDATE column = value [, column = value] ...
插入数据否则更新这个是为了应对当在插入数据时发生的主键冲突或者唯一键冲突;
当插入数据时发生主键冲突或者唯一键冲突时使用这个语法时将会将原本的数据删除并以新的数据进行插入并替换该数据;
以该表为例:
+----+-------+-----------+---------------+ | id | sn | name | email | +----+-------+-----------+---------------+ | 01 | 00001 | Lihua | 123456@xx.com | | 02 | 00002 | Zhangqian | NULL | | 03 | 00003 | Liqiang | 112233 | | 04 | 00004 | Zhangwu | 223344 | | 05 | 00005 | Liuba | 445566 | +----+-------+-----------+---------------+ mysql> show create table stu\G *************************** 1. row *************************** Table: stu Create Table: CREATE TABLE `stu` ( `id` int(2) unsigned zerofill NOT NULL COMMENT 'id并设置主键约束', `sn` int(5) unsigned zerofill NOT NULL COMMENT '学号', `name` varchar(20) NOT NULL COMMENT '姓名', `email` varchar(32) DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (`id`), UNIQUE KEY `sn` (`sn`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8
从上面的代码可以看出其中id
字段设有主键约束,sn
字段设有唯一键约束;
在不使用替换的语法前对其进行插入数据,且人为的触发其中一个约束冲突;
#主键冲突 mysql> insert into stu values(5,6,'Lianhua','22222'); ERROR 1062 (23000): Duplicate entry '05' for key 'PRIMARY' #唯一键冲突 mysql> insert into stu values(6,5,'Lianhua','22222'); ERROR 1062 (23000): Duplicate entry '00005' for key 'sn'
当发生冲突时使用语法使其完成当发生键值冲突进行替换;
mysql> insert into stu values(5,6,'Lianhua','22222') -> on duplicate key update id = 6,sn = 6,name ='LIANHUA',email='22222'; Query OK, 2 rows affected (0.00 sec) mysql> select * from stu; +----+-------+-----------+---------------+ | id | sn | name | email | +----+-------+-----------+---------------+ | 01 | 00001 | Lihua | 123456@xx.com | | 02 | 00002 | Zhangqian | NULL | | 03 | 00003 | Liqiang | 112233 | | 04 | 00004 | Zhangwu | 223344 | | 06 | 00006 | LIANHUA | 22222 | #->已经发生了替换 +----+-------+-----------+---------------+
从上面的操作可以看出原来的其中一个字段为:
| 05 | 00005 | Liuba | 445566 |
在这次插入失败后进行了替换,替换为了:
| 06 | 00006 | LIANHUA | 22222 |
不仅如此,在替换成功时也有对应的提示:
Query OK, 2 rows affected (0.00 sec)
在MySQL中以该方式进行数据插入时,会有对应提示:
-- 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等 -- 1 row affected: 表中没有冲突数据,数据被插入 -- 2 row affected: 表中有冲突数据,并且数据已经被更新
📌数据的替换📌
数据的替换类比于上一个插入数据否则更新
;
数据的替换真正的意义上是:
- 若是发生主键冲突或者唯一键冲突,则删除原数据再进行插入;
- 若是未发生主键冲突也未发生唯一键冲突,则直接插入数据;
对应的语法即为INSERT INTO
变为REPLACE INTO
;
mysql> replace into stu values(5,6,'Lianhua','22222'); Query OK, 2 rows affected (0.00 sec)
『 MySQL数据库 』表的增删查改(CRUD)之表的数据插入及基本查询(下)https://developer.aliyun.com/article/1424460