MySQL 基础教程

MySQL 高级教程

MySQL SQL 语句

MySQL 笔记

MySQL 插入/添加数据语句(INSERT INTO)用法详解


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 语句更新操作如何增加条件操作