mysql 条件插入 - 如果不存在插入

Posted

技术标签:

【中文标题】mysql 条件插入 - 如果不存在插入【英文标题】:mysql conditional insert - if not exists insert 【发布时间】:2011-01-14 11:11:02 【问题描述】:

是否有一个查询只检查记录,如果它不存在插入?我不想重复更新或替换。寻找一个查询解决方案,查看其他答案,但不是我所希望的。

表:

name|value|id
------------------
phill|person|12345

伪查询:

IF NOT EXISTS(name='phill', value='person', id=12345) INSERT INTO table_name

【问题讨论】:

你能澄清一下这个问题吗? id 是唯一的唯一字段吗? (以一种快速而肮脏的方式,您可以使用唯一索引,如果您尝试插入具有重复值的行,它将失败)。名称和值也必须是唯一的吗? 三个值都是唯一的,不能为空。 id 有索引,名称和值也应该不同,但 id 是必须的 【参考方案1】:

使用REPLACE - 工作方式与 INSERT 完全相同,只是如果表中的旧行与 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,则在插入新行之前删除旧行.

http://dev.mysql.com/doc/refman/5.0/en/replace.html

-- For your example query
REPLACE INTO table_name(name, value, id) VALUES
('phill', 'person', 12345) 

编辑:由于您不能使用 REPLACE,另一个选项是:为表数据设置约束索引(主键、唯一性)并使用 INSERT IGNORE

INSERT IGNORE INTO table_name
SET name = 'phill',
    value = 'person',
    id = 12345;

【讨论】:

是的,我了解该功能,但我的用户只能访问 SELECT、INSERT、UPDATE。但我试图远离 UPDATE 并且我不知道我是否有权使用 REPLACE 功能 INSERT IGNORE 是否删除并再次添加记录?还是如果找到就跳过它,如果没有找到就插入?【参考方案2】:

如何从具有子查询的选择查询中插入仅在该行不存在时才返回该行?

伪代码:

INSERT INTO TABLE_FOO (...)
SELECT @VAR1, VAR2 ...
FROM DUMMYTABLE -- THIS TABLE SHOULD CONTAIN 1 RECORD OF ANYTHING
                -- IN CASE THE FROM IS REQUIRED
WHERE (SELECT COUNT(*) FROM TABLE_FOO WHERE COLUMN1 = @VAR1) = 0

这种模式应该可以工作,您只需要为 MySQL 获取正确的语法。

【讨论】:

这在处理不使用键或唯一性的行时很有用。

以上是关于mysql 条件插入 - 如果不存在插入的主要内容,如果未能解决你的问题,请参考以下文章

MySQL INSERT插入条件判断:如果不存在则插入

如果不存在条件mysql则插入一个元组

如果不存在则插入记录的MySQL条件[重复]

如果记录存在则插入和更新,否则不存在竞争条件

Mysql插入数据:不存在则插入,存在则跳过或更新

MySQL插入不存在/如果不存在