MySQL: 若表中不存在记录则插入
MySQL: 若表中不存在记录则插入
这个问题已经有了答案:
我正在尝试执行以下查询:
INSERT INTO table_listnames (name, address, tele) VALUES ('Rupert', 'Somewhere', '022') WHERE NOT EXISTS ( SELECT name FROM table_listnames WHERE name='value' );
但是这会返回一个错误。基本上,如果记录的“name”字段已经存在于另一条记录中,我不想插入记录-如何检查新名称是否唯一?
admin 更改状态以发布 2023年5月23日
您可以采取以下方法:在应该是唯一的字段(name
)上创建一个UNIQUE INDEX
,然后使用:
- 常规的
INSERT
(如果名称已经存在,处理错误) INSERT IGNORE
(如果名称已经存在,则会引发警告(而不是错误))INSERT ... ON DUPLICATE KEY UPDATE
(如果名称已经存在,则在最后执行UPDATE
。 请参见文档)
我并不是真的建议你这样做,因为像Piskvor和其他人建议的使用UNIQUE
索引是更好的做法,但是你实际上可以做你原来尝试的事情:
CREATE TABLE `table_listnames` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) NOT NULL, `address` varchar(255) NOT NULL, `tele` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB;
插入一条记录:
INSERT INTO table_listnames (name, address, tele) SELECT * FROM (SELECT 'Rupert', 'Somewhere', '022') AS tmp WHERE NOT EXISTS ( SELECT name FROM table_listnames WHERE name = 'Rupert' ) LIMIT 1; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 SELECT * FROM `table_listnames`; +----+--------+-----------+------+ | id | name | address | tele | +----+--------+-----------+------+ | 1 | Rupert | Somewhere | 022 | +----+--------+-----------+------+
尝试再次插入相同的记录:
INSERT INTO table_listnames (name, address, tele) SELECT * FROM (SELECT 'Rupert', 'Somewhere', '022') AS tmp WHERE NOT EXISTS ( SELECT name FROM table_listnames WHERE name = 'Rupert' ) LIMIT 1; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 +----+--------+-----------+------+ | id | name | address | tele | +----+--------+-----------+------+ | 1 | Rupert | Somewhere | 022 | +----+--------+-----------+------+
插入不同的记录:
INSERT INTO table_listnames (name, address, tele) SELECT * FROM (SELECT 'John', 'Doe', '022') AS tmp WHERE NOT EXISTS ( SELECT name FROM table_listnames WHERE name = 'John' ) LIMIT 1; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 SELECT * FROM `table_listnames`; +----+--------+-----------+------+ | id | name | address | tele | +----+--------+-----------+------+ | 1 | Rupert | Somewhere | 022 | | 2 | John | Doe | 022 | +----+--------+-----------+------+
以此类推...
更新:
为了防止#1060 - Duplicate column name
错误(因为两个值可能相等),你必须为内部SELECT的列命名:
INSERT INTO table_listnames (name, address, tele) SELECT * FROM (SELECT 'Unknown' AS name, 'Unknown' AS address, '022' AS tele) AS tmp WHERE NOT EXISTS ( SELECT name FROM table_listnames WHERE name = 'Rupert' ) LIMIT 1; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 SELECT * FROM `table_listnames`; +----+---------+-----------+------+ | id | name | address | tele | +----+---------+-----------+------+ | 1 | Rupert | Somewhere | 022 | | 2 | John | Doe | 022 | | 3 | Unknown | Unknown | 022 | +----+---------+-----------+------+