MySQL 如何仅插入MySQL表中不存在的记录?
在实际开发中,我们经常需要插入新的记录到MySQL表中,但我们又不希望重复插入已经存在的记录。这时候,我们可以使用MySQL的INSERT INTO语句配合SELECT语句来实现仅插入不存在的记录。
阅读更多:MySQL 教程
什么是INSERT INTO语句和SELECT语句?
INSERT INTO语句是MySQL中用来插入一条或多条记录到表中的语句,语法如下:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
其中,table_name是要插入记录的表名,column1, column2, column3, …是要插入记录的列名,而value1, value2, value3, …是要插入记录的值。
而SELECT语句是MySQL中用来查询数据库中的数据的语句,语法如下:
SELECT column1, column2, column3, ...
FROM table_name;
其中,column1, column2, column3, …是要查询的列名,table_name是要查询的表名。
如何仅插入MySQL表中不存在的记录?
我们可以通过在INSERT INTO语句中配合SELECT语句来实现仅插入MySQL表中不存在的记录。具体方法是,首先在SELECT语句中查询出要插入的记录,然后将其作为子查询嵌入到INSERT INTO语句中,只插入SELECT语句查询结果中不存在的记录。语法如下:
INSERT INTO table_name (column1, column2, column3, ...)
SELECT value1, value2, value3, ...
FROM (SELECT value1, value2, value3, ...
FROM table_name
WHERE NOT EXISTS (SELECT * FROM table_name WHERE column1=value1 AND column2=value2 AND column3=value3)) AS t;
其中,table_name是要插入记录的表名,column1, column2, column3, …是要插入记录的列名,而value1, value2, value3, …是要插入记录的值。NOT EXISTS子句用于判断要插入的记录是否已存在于表中。
示例
假设我们有一个表students,包含id、name、age三个字段。现在我们要插入以下两条记录:
INSERT INTO students (id, name, age)
VALUES (1, 'Tom', 20);
INSERT INTO students (id, name, age)
VALUES (2, 'Jerry', 22);
但我们又不希望重复插入已经存在的记录。这时候,我们可以使用以下语句仅插入不存在的记录:
INSERT INTO students (id, name, age)
SELECT 1, 'Tom', 20
FROM (SELECT 1, 'Tom', 20
FROM students
WHERE NOT EXISTS (SELECT * FROM students WHERE id=1 AND name='Tom' AND age=20)) AS t;
INSERT INTO students (id, name, age)
SELECT 2, 'Jerry', 22
FROM (SELECT 2, 'Jerry', 22
FROM students
WHERE NOT EXISTS (SELECT * FROM students WHERE id=2 AND name='Jerry' AND age=22)) AS t;
执行以上语句后,students表中将只插入一条记录:
id | name | age |
---|---|---|
1 | Tom | 20 |
2 | Jerry | 22 |
结论
通过在INSERT INTO语句中配合SELECT语句来实现仅插入MySQL表中不存在的记录,可以避免重复插入已经存在的记录。