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 条件插入 - 如果不存在插入的主要内容,如果未能解决你的问题,请参考以下文章