Mysql 简明教程

MySQL - Insert Ignore

在 MySQL 中,可以 INSERT INTO 语句来将一个或多个记录插入到表中。

在某些情况下,如果某个特定列有唯一约束,并且我们尝试使用 INSERT INTO 语句将重复记录添加到该特定列,则 MySQL 将终止该语句并返回错误。结果,没有行被插入到表中。

MySQL Insert Ignore Statement

然而,如果我们使用 MySQL INSERT IGNORE INTO 语句,它将不会显示错误。相反,它允许我们将有效数据插入到表中,并忽略会导致错误的包含无效数据的行。

以下是 INSERT IGNORE INTO 语句避免错误的一些情况:

  1. 当我们向有 UNIQUE 键或 PRIMARY 键约束的表中插入重复值时。

  2. 当我们尝试向在其中有 NOT NULL 约束的列添加 NULL 值时。

Syntax

以下是 MySQL 中 INSERT IGNORE 语句的语法 −

INSERT IGNORE INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

Example

首先,让我们使用以下查询创建一个名为 CUSTOMERS 的表 −

Note: UNIQUE 约束确保没有重复值可以存储或插入到 NAME 列中。

CREATE TABLE CUSTOMERS (
   ID int NOT NULL,
   NAME varchar(20) NOT NULL UNIQUE,
   PRIMARY KEY (ID)
);

以下查询将三条记录插入到 CUSTOMERS 表中 −

INSERT INTO CUSTOMERS (ID, NAME)
VALUES (1, "Ajay"), (2, "Vinay"), (3, "Arjun");

执行以下查询以显示 CUSTOMERS 表中存在的记录 −

SELECT * FROM CUSTOMERS;

以下是 CUSTOMERS 表的记录:

现在,让我们使用以下查询向 CUSTOMERS 表的 NAME 列中插入一条重复记录 −

INSERT INTO CUSTOMERS (NAME) VALUES (2, "Arjun");

它返回了一个错误,因为 NAME “Arjun” 已存在于该列中,因此它违反了 UNIQUE 约束。

ERROR 1062 (23000): Duplicate entry 'Arjun' for key 'customers.NAME'

现在,让我们使用 INSERT IGNORE 语句,如下所示 −

INSERT IGNORE INTO CUSTOMERS (NAME) VALUES (2, "Arjun");

Output

虽然我们插入了一个重复值,但它不会显示任何错误,而是会发出警告。

Query OK, 0 rows affected, 1 warning (0.00 sec)

我们可以使用以下查询查找以上警告的详细信息 −

SHOW WARNINGS;

以下是警告表 −

Verification

如果我们尝试验证 CUSTOMERS 表,我们可以发现我们尝试插入的重复行不再存在于表中。

SELECT * FROM CUSTOMERS;

以上程序的输出如下所示:

MySQL INSERT IGNORE and STRICT mode

严格模式控制 MySQL 如何处理通过诸如 INSERTUPDATE 数据更改语句将添加到表中的无效、缺失或超出范围的值。

因此,如果严格模式是 ON ,并且我们尝试使用 INSERT 语句将一些无效值插入表中,那么 MySQL 终止语句并返回一条错误消息。

但是,如果我们使用 INSERT IGNORE INTO 语句,MySQL 将调整这些值以使其有效,而不是返回错误。

Example

让我们使用以下查询创建一个名为 CUSTOMERS 的表 −

Note: NAME 列仅接受长度小于或等于五的字符串。

CREATE TABLE CUSTOMERS (
   ID int NOT NULL,
   NAME varchar(5),
   PRIMARY KEY (ID)
);

在此尝试插入值到 NAME 列中,其长度大于 5。

INSERT INTO CUSTOMERS (NAME) VALUES (1, "Malinga");

它返回了下述错误 −

ERROR 1406 (22001): Data too long for column 'NAME' at row 1

现在尝试使用 INSERT IGNORE 语句插入同一字符串 −

INSERT IGNORE INTO CUSTOMERS (NAME) VALUES (1, "Malinga");

Output

就像可以在输出中看到的一样,它没有返回错误而是显示一个警告 −

Query OK, 1 row affected, 1 warning (0.01 sec)

让我们通过使用以下命令找到有关上述警告的详细信息 −

SHOW WARNINGS;

就像可以在下述输出中看到的一样,MySQL 在将其插入 CUSTOMERS 表之前截断了数据。

Verification

执行以下查询验证 CUSTOMERS 表的记录 −

Select * from CUSTOMERS;

就像可以在下述 CUSTOMERS 表中看到的一样,该值已被截断至 5 个字符并插入到该表中。

Insert Ignore Query Using a Client Program

除了使用 MySQL 查询执行忽略插入操作外,还可以使用 Node.js、PHP、Java 和 Python 等客户端程序来获得相同的结果。

Syntax

以下是此操作在各种编程语言中的语法 −

Example

以下是这些程序 −