INSERT IGONRE
使用INSERT INTO
语句向表插入多行数据时,可能会在语法层、规划层或执行层遇到错误,INSERT INTO
语句会直接中止当前插入操作返回错误信息,只会向表插入当前错误行之前的行数据,剩下的行数据也会被中断。
INSERT IGNORE INTO
语句忽略插入多行数据时一些违反约束信息导致的错误行,过滤不满足约束的行数据,将正确行数据都插入表中。
说明:
忽略执行层检查约束信息时遇到的错误,而语法层、规划层遇到的错误依旧正常报错。
主要语法结构
语法格式
sql
ignore_stmt::=
INSERT IGNORE INTO [schema_name.] table_name [PARTITION ( part_name_list ) | SUBPARTITION ( subpart_name_list )] insert_rest
参数说明
schema_name
:模式名。table_name
:表名。part_name_list
:表的分区名。subpart_name_list
:表的子分区名。
插入内容insert_rest
语法格式
sql
insert_rest::=
VALUES ( target_list )[( target_list ) | ,( target_list )]...
| DEFAULT VALUES
| selectstmt
| ( columnList ) VALUES ( target_list )[( target_list ) | ,( target_list )]...
| ( columnList ) selectstmt
| VALUES ident
| ( columnList ) VALUES ident
参数说明
VALUES ( target_list )[( target_list ) | ,( target_list )]...
:直接插入一组或多组值。DEFAULT VALUES
:插入默认值,适用于所有列都有默认值的情况。selectstmt
:一个 SELECT 语句,返回要插入的数据。从子查询中插入数据。( columnList ) VALUES ( target_list )[( target_list ) | ,( target_list )]...
:指定列列表并插入一组或多组值。( target_list )
插入的数据有以下形式(expr1, expr2, ..., exprn)
,括号中以逗号分隔的每项可以是常值、表达式等,每项与要插入数据的列对应。(expr1, expr2, ..., exprn) (expr1, expr2, ..., exprn) ...
等,用以在一条语句里插入多行数据。(expr1, expr2, ..., exprn),(expr1, expr2, ..., exprn),...
等,使用英文逗号分隔每一行插入的数据,插入多行数据。
( columnList ) selectstmt
:指定列列表并从子查询中插入数据。VALUES ident
:插入一个标识符(通常是变量或参数)。( columnList ) VALUES ident
:指定列列表并插入一个标识符(通常是变量或参数)。
示例
示例1
同时执行多行插入命令,向含有唯一值约束的表插入三行数据,其中前两行为相同的数据,若不带IGNORE关键字,插入第二行数据时会检测约束信息限制,终止当前插入操作返回错误信息,因此只有第一行数据插入成功。若带IGNORE关键字则忽略当前行的数据插入操作,继续执行下一行数据插入操作,因此第一和第三行数据插入成功。sqlCREATE TABLE table_1(id INT,name VARCHAR,CONSTRAINT u_1 UNIQUE(id)); --INSERT 同时插入多行数据 INSERT INTO table_1 VALUES(1,'abc'); INSERT INTO table_1 VALUES(1,'abc'); INSERT INTO table_1 VALUES(2,'abc'); --只有第一行数据插入成功 SELECT * FROM table_1; --INSERT IGNORE 同时插入多行数据 INSERT IGNORE INTO table_1 VALUES(1,'abc'); INSERT IGNORE INTO table_1 VALUES(1,'abc'); INSERT IGNORE INTO table_1 VALUES(2,'abc'); --过滤第二行错误,成功插入第一、三行数据 SELECT * FROM table_1;
示例2
执行一个插入命令,向含有唯一值约束的表插入三行数据,其中前两行为相同的数据,若不带IGNORE关键字,插入第二行数据时会检测到约束信息限制,终止当前插入操作返回错误信息,因此当前插入命令失败,没有数据插入。若带IGNORE关键字则忽略当前行的数据错误,继续执行下一行数据插入操作,因此第一和第三行数据插入成功。sql--INSERT 同时插入多行数据 INSERT INTO table_1 VALUES(3,'abc')(3,'abc')(4,'abc'); --没有数据插入成功 SELECT * FROM table_1; --INSERT IGNOR 同时插入多行数据 INSERT IGNORE INTO table_1 VALUES(3,'abc')(3,'abc')(4,'abc'); --过滤第二组错误,成功插入第一、三组数据 SELECT * FROM table_1;