Skip to content

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关键字则忽略当前行的数据插入操作,继续执行下一行数据插入操作,因此第一和第三行数据插入成功。

    sql
    CREATE 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;