2013-07-24 104 views
2

在我的数据库中,我有tickets_users附属于用户的票。如果该值不存在,则插入

我愿意做一个INSERT,在tickets_users检查是否存在尚未这个users_id(例如用户1444)和type = 2 WHERE tickets_id = something(例如准考证号455);如果它已经存在什么也不做,否则

INSERT INTO tickets_users (tickets_id, users_id, type) VALUES (455, 1444, 2) 
WHERE tickets_id = 455 
+1

想[这](http://stackoverflow.com/questions/5528854/usage-of-mysqls-if-exists)可能是你在找什么? – vanamerongen

+0

[替换](http://dev.mysql.com/doc/refman/5.0/en/replace.html)?但有一点需要注意,它与Oracle中的MERGE不同。这是'INSERT's或'DELETE's'' INSERT's。 –

+0

自动增量中的tickets_users.id,如果类型,tickets_id和users_id匹配,我不想删除旧的,只是不做任何事情,只有在不匹配时才会插入 – Mokkun

回答

3
INSERT INTO tickets_users (tickets_id, users_id, type) 
select 455, 1444, 2 from dual 
WHERE not exists (select 1 from tickets_users where type = 2 and tickets_id = something) 

试试这个

编辑:
要添加多行

INSERT INTO tickets_users (tickets_id, users_id, type) 
select 455, 1444, 2 from dual 
WHERE not exists (select 1 from tickets_users where type = 2 and tickets_id = 455) 
union all 
select 456, 1444, 2 from dual 
WHERE not exists (select 1 from tickets_users where type = 2 and tickets_id = 456) 
+0

感谢您的请求似乎工作,但如何将此请求用于多个INSERT?例如使用SELECT 455,1444,2 WHERE tickets_id = 455,但也选择425,1226,2 WHERE tickets_id = 425 etc ... – Mokkun

+0

您可以使用联合所有 – Akhil

+0

请您编辑您的答案,告诉我如何查询联盟看所有让2票? – Mokkun

4

您可以使用一个PRIMARY KEY或UNIQUE索引包含适当字段的表格以停止重复记录。

PRIMARY KEY 

使用INSERT IGNORE而不是INSERT。如果一条记录没有复制现有的记录,MySQL会照常插入它。如果记录是重复的,那么IGNORE关键字告诉MySQL放弃它而不会产生错误。

INSERT IGNORE 

对于实施例:所述ID被假定为是主键。如果表'tablename'中的记录已经有id = 1的记录,那么查询将被忽略而不是产生警告。

注意:仅在开发阶段使用IGNORE关键字。它可能会导致意外的结果,因为您无法确定记录是否已插入。

+0

刚刚尝试过'INSERT IGNORE INTO tickets_users(tickets_id,users_id,type,use_notification)VALUES(1,1444,2,1)',它仍然添加它,我做错了什么? – Mokkun

+0

r将列键添加到列 –

+0

我不认为'INSERT IGNORE'是推荐的用法。它会忽略所有类型的错误,即使它应该被捕获为不正确的格式等。[见此](http://stackoverflow.com/questions/548541/insert-ignore-vs-insert-on-duplicate-key-更新) – Akhil

相关问题