MySQL INSERT IGNORE

17 Mar 2025 | 4 分钟阅读

MySQL 中的 INSERT IGNORE 语句有一个特殊功能,它可以在我们插入单行或多行数据到表中时,忽略掉无效的行。我们可以通过下面的解释来理解这一点,其中一个表包含一个主键列。

主键列不能在表中存储重复值。例如,student_roll_number 对于每个学生都应始终唯一。同样,公司中的employee_id 在员工表中也应始终是唯一的。当我们尝试将重复记录插入到具有主键列的表中时,会产生错误消息。但是,如果我们使用 INSERT IGNORE 语句将重复行添加到具有主键列的表中,MySQL 不会产生任何错误。当我们在批量插入记录时,并且可能出现的错误会中断执行过程,此时就推荐使用此语句。因此,它不会将任何记录存储到表中。在这种情况下,INSERT IGNORE 语句只会生成警告。

下面是 INSERT IGNORE 语句可以避免错误的情况:

  • 当我们尝试插入一个重复键,而表中的列具有 PRIMARY 或 UNIQUE KEY 约束时。
  • 当我们尝试添加一个 NULL 值,而表中的列具有 NOT NULL 约束时。
  • 当我们尝试将记录插入到分区表中,而输入的值不符合列出的分区的格式时。

语法

以下是在 MySQL 中使用 INSERT IGNORE 语句的语法:

MySQL INSERT IGNORE 示例

让我们通过一个示例来了解 INSERT IGNORE 语句如何在 MySQL 中工作。首先,我们需要创建一个名为 "Student" 的表,使用以下语句:

UNIQUE 约束确保我们不能将重复值插入到 email 列中。接下来,需要向表中插入记录。我们可以执行以下语句将数据添加到表中:

最后,执行 SELECT 语句来验证插入操作:

我们可以看到下面的输出,表中有三行数据:

MySQL INSERT IGNORE

让我们执行以下语句,该语句将尝试向表中添加两条记录:

这将产生一个错误:ERROR 1062 (23000): Duplicate entry '[email protected]' for key 'student.Email',因为电子邮件违反了 UNIQUE 约束。

现在,让我们看看如果在上述查询中使用 INSERT IGNORE 语句会发生什么:

MySQL 将会显示一条消息:已添加一行,另一行被忽略。

我们可以使用 SHOW WARNINGS 命令查看详细的警告:

MySQL INSERT IGNORE

因此,我们可以说,如果我们使用 INSERT IGNORE 语句,MySQL 将给出警告而不是报错。

MySQL INSERT IGNORE 和 STRICT 模式

在 MySQL 中,STRICT MODE 处理在使用 INSERT 或 UPDATE 语句添加到表中的无效或缺失值。如果 strict mode 为 ON,并且我们尝试使用 INSERT 语句将无效值添加到表中,则语句将被中止,并且我们会收到错误消息。

但是,如果我们使用 INSERT IGNORE 命令,MySQL 会生成警告消息而不是抛出错误。此外,该语句会尝试截断值,使其在插入到表中之前是有效的。

让我们通过一个例子来理解这一点。首先,我们将创建一个名为 "Test" 的表,使用以下语句:

在上面的表中,name 列只接受长度小于或等于五个字符的字符串。现在,执行以下语句将记录插入到表中:

我们可以看到指定的名称验证了 name 列的约束,因此它将被成功添加。执行 SELECT 语句来验证结果。它将给出如下输出:

MySQL INSERT IGNORE

接下来,插入长度大于五的名称:

MySQL 不会添加值并显示错误消息,因为 strict mode 为 ON。但是,如果我们使用 INSERT IGNORE 语句插入相同的字符串,它将显示警告消息而不是抛出错误。

最后,我们执行了 SHOW WARNINGS 命令来检查警告消息。下面的输出更清楚地解释了这一点,显示 MySQL 在插入表之前尝试截断数据。

MySQL INSERT IGNORE