MySQL 插入数据操作使用 INSERT INTO
语句,它属于 DML(数据操作语言)范畴,该语句插入方式支持从简单的添加操作到唯一键(唯一索引)冲突时的更新操作,同时也支持查询结果直接插入操作。
INSERT INTO
MySQL INSERT 语句主要三种形式,明确指定的值进行插入的 INSERT ... VALUES ...
和 INSERT ... SET ...
,还有一种形式是从另一个表或多个表中的查询结果作为插入的值,以 INSERT ... SELECT ...
格式。
语法
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
INTO tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
{VALUES | VALUE} (value_list) [, (value_list)] ...
[ON DUPLICATE KEY UPDATE assignment_list]
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
INTO tbl_name
[PARTITION (partition_name [, partition_name] ...)]
SET assignment_list
[ON DUPLICATE KEY UPDATE assignment_list]
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
INTO tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
SELECT ...
[ON DUPLICATE KEY UPDATE assignment_list]
修饰符
INSERT 语句支持修饰符主要如下:
IGNORE
- 顾名思义插入忽略的操作,如果要插入的数据和现有的唯一索引(unique index)或主键(primary key)冲突(已存在),则该插入值操作忽略;若省略 IGNORE 修饰符时,键冲突时,会报失败错误。
ON DUPLICATE KEY UPDATE
- 和 IGNORE 用法相反,当插入的数据和唯一键值或主键冲突时,进行更新操作,此时返回的受影响的行数为 2;若键值不冲突,则执行普通的插入操作,受影响的行数为 1;还有一种特殊情况是键值冲突进行更新时,若要更新的数据和原有的数据一样,受影响行数返回 0,即第一种的特殊情况。此修饰符的作用,通俗的讲就是“记录存在则更新,不存在则插入”。
关于如上两个修饰符 IGNORE 和 ON DUPLICATE KEY UPDATE,需要使用者注意的是,如果插入数据时,真正触发由于唯一键冲突导致忽略或进行修改操作时,如果操作表还有自增 id,将会导致后续的新插入数据自增 id 不连续,这是因为虽然忽略或 UPDATE 了,但是自增 id 同时也分配到了。
示例
mysql> INSERT INTO knowledgedict_tbl (title, content) VALUES ('knowledge', 'dict');
如上语句等同于如下语句:
mysql> INSERT INTO knowledgedict_tbl SET title = 'knowledge', content = 'dict';
如果从其它表导入数据,示例如下:
mysql> INSERT INTO knowledgedict_tbl (title, content) SELECT article_title, article_content FROM other_tbl;
此外,如果插入的数据和已有数据冲突(唯一键冲突)时,可以通过 IGNORE 和 ON DUPLICATE KEY UPDATE 两种操作方式选择是忽略还是进行修改动作。
假设 title 字段是唯一索引,即数据不可重复;
若忽略操作:
mysql> INSERT IGNORE INTO knowledgedict_tbl (title, content) VALUES ('knowledge', 'dict');
若更新操作:
mysql> INSERT INTO knowledgedict_tbl (title, content) VALUES ('knowledge', 'dict') ON DUPLICATE KEY UPDATE title = VALUES(title), content = VALUES(content);
相关推荐
- INSERT INTO ... ON DUPLICATE KEY UPDATE 语句更新操作如何增加条件操作