INSERT
语法
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] [(col,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] ... ]
或:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] ... ]
或:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] [(col,...)] SELECT ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] ... ]
INSERT
语句用于向表中插入新行。其中INSERT...VALUES
和INSERT...SET
两种语法格式插入数据时需要显式指定字段的值。INSERT...SELECT
格式插入的数据是从其他表中筛选出来的。INSERT...SELECT
相关内容在INSERT ... SELECT
中单独讨论。
表名可以指定为db_name
.tbl_name
,如果指定了默认数据库,则可以直接指定为tbl_name
(见Identifier Qualifiers)。这使得MaraiDB可以通过INSERT ... SELECT语句在不同数据库之间拷贝数据。
MariaDB starting with 10.0
PARTITION
子句是在MariaDB 10.0版本中引入的功能。它可以应用在INSERT和SELECT中。详细信息见Partition Pruning and Selection。
INSERT语句中的字段列表是可选的。如果指定了字段,则显式表示对应的值插入到哪个字段中,此时VALUES子句中的值可以不用按照表定义语句中指定的字段顺序来给定。如果未指定字段列表,所有的值必须显式按照表定义语句中的字段顺序来给定。
VALUES
或VALUE
关键字中的是值列表,它们使用括号包围。括号中的值列表必须按照字段顺序给定。在单个INSERT语句中可以同时指定多个值列表表示插入多行,而无需每行使用一个INSERT语句。如果有很多行需要插入,这也是一个性能提升点。
对于只插入单行的INSERT语句,使用SET
子句则要更简单、更方便的多,因为你无需记住字段的顺序,所有的值都在col = expr
中指定了。
要插入的值同样可以通过SQL表达式或者子查询来指定。但如果通过子查询来指定时,该子查询不能访问带插入的表(即INTO
子句后的表)。
如果使用了LOW_PRIORITY
关键字,INSERT
将被延迟到没有其他客户端读取该表的时候执行。如果使用了HIGH_PRIORITY
关键字,则该语句和SELECT
语句具有相同的优先级。只有那些仅使用表级锁的存储引擎(MyISAM, MEMORY, MERGE)才会受这几个关键字的影响。但是,如果指定了这些关键字中的某一个,concurrent inserts将无法使用。详细信息见HIGH_PRIORITY and LOW_PRIORITY clauses。
关于DELAYED
更多信息,见INSERT DELAYED
。
Defaults and Duplicate Values
INSERT IGNORE
示例
指定插入的字段名:
INSERT INTO person (first_name, last_name) VALUES ('John', 'Doe');
一次性插入多行:
INSERT INTO tbl_name VALUES (1, "row 1"), (2, "row 2");
使用SET
子句插入行:
INSERT INTO person SET first_name = 'John', last_name = 'Doe';
从其他表中SELECT一些数据插入到该表中:
INSERT INTO contractor SELECT * FROM person WHERE status = 'c';
更多示例见INSERT ON DUPLICATE KEY UPDATE和INSERT IGNORE。