佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 2202|回复: 8

MySQL Query On Duplicate Key 求教。

[复制链接]
发表于 16-6-2011 05:14 PM | 显示全部楼层 |阅读模式
目前面对一个难题,想向大家求教一下是否有更精简的解决方法:

我的数据库里有一个Table,里面是记录每年的数据分类项目,主要是用来做Master Table的。Columns分别为
1)Year 记录年份
2)Cat_Code 分类代码
3)Mem_ID 拥有这个数据的会员的ID

当我要添加新数据时就要检测今年这个会员是否已经有相关的分类的数据的存在,如果没有就添加新的Row,如果已经有这个记录,则跳过不必处理。每个会员每一年会有数个分类,但是分类不会重复。也就是说:

  1. Year    Mem_ID    Cat_Code
  2. 2011    A0001       A
  3. 2011    A0001       B
  4. 2010    A0001       A
  5. ...
复制代码
我想问的是,是否能够直接以一个Query Statement完成检测该数据是否存在,并且根据检测结果,插入新数据或则掠过不处理?我是有在MySQL Document里面看到 INSERT INTO [table] ON DUPLICATE KEY UPDATE [update expr] 的方式,可是有两个不大了解的问题:

1)我的检测对象是3个Columns,是否能够成为Unique Key?能的话,如何做?以我的理解,On Dupicate Key针对的应该是单个Column,例如Primary Key。

2)如果使用On Duplicate Key Update...,却又和我的本意不符,因为我的logic是On Duplicate Key do nothing,而不是要Update什么。

我目前是通过我的Application针对每个条件来Query,Select * From Cat_table Where Year=2011 AND Mem_ID='A0001' AND Cat_Code='A',Query后看RecordCount是否>0,感觉挺麻烦的,在资源方面也觉得挺浪费的,因为要不停地浪费记忆体来select data。
回复

使用道具 举报


ADVERTISEMENT

发表于 18-6-2011 04:29 PM | 显示全部楼层
如在 MSSQL 我会用

  1. if not exists(Select * From Cat_table Where Year=2011 AND Mem_ID='A0001' AND Cat_Code='A')
  2. insert into Cat_table values(2011,'A0001','A')
复制代码
MySQL 好像可以用

  1. if (Select * From Cat_table Where Year=2011 AND Mem_ID='A0001' AND Cat_Code='A') is null then
  2.     insert into Cat_table values(2011,'A0001','A')
  3. end if
复制代码
回复

使用道具 举报

 楼主| 发表于 20-6-2011 10:36 AM | 显示全部楼层
噢噢!谢谢你的回答,待会儿去试试。
回复

使用道具 举报

 楼主| 发表于 20-6-2011 01:05 PM | 显示全部楼层
貌似不对。。。MySQL的IF()Syntax不是这样的。。。
回复

使用道具 举报

 楼主| 发表于 20-6-2011 01:53 PM | 显示全部楼层
原来答案是INSERT IGNORE + UNIQUE INDEX。。。MySQL的Document里面并没有清楚的解释IGNORE的实际用法,所以我一直没注意到。。。该死的Documentation Writer!:@
回复

使用道具 举报

发表于 21-6-2011 04:09 PM | 显示全部楼层
回复 5# geekman

我也是在找着答案。原来 MySQL 没有 If Not Exists 这个东东。

我也是看到 Insert Ignore + Unique Index 的 solution 而已。
用惯 M$SQL,不好意思。


http://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html

http://lists.mysql.com/mysql/169692
回复

使用道具 举报

Follow Us
 楼主| 发表于 21-6-2011 04:17 PM | 显示全部楼层
最近才了解到,MySQL的Flow Control并不支援Code Block甚至sub query(除非sub query return的数据是Numeric或者string value),IF()只能return numeric(boolean)以及string罢了。
回复

使用道具 举报

发表于 27-6-2011 02:52 PM | 显示全部楼层
回复 7# geekman

免费东西,是酱的
回复

使用道具 举报


ADVERTISEMENT

发表于 25-9-2011 09:52 PM | 显示全部楼层
我的方法很简单
首先我会execuate update 的query 先
如果有affected rows>0 的话,那就结束
如果 affected rows=0 的话,我就跑insert query
完成! 当然这只能在program 里实行,如果你会begin transaction的话,那我可以担保你不会有duplicate key 的问题出现
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT


本周最热论坛帖子本周最热论坛帖子

ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 11-11-2025 09:41 PM , Processed in 0.115430 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表