|
查看: 2202|回复: 8
|
MySQL Query On Duplicate Key 求教。
[复制链接]
|
|
|
目前面对一个难题,想向大家求教一下是否有更精简的解决方法:
我的数据库里有一个Table,里面是记录每年的数据分类项目,主要是用来做Master Table的。Columns分别为
1)Year 记录年份
2)Cat_Code 分类代码
3)Mem_ID 拥有这个数据的会员的ID
当我要添加新数据时就要检测今年这个会员是否已经有相关的分类的数据的存在,如果没有就添加新的Row,如果已经有这个记录,则跳过不必处理。每个会员每一年会有数个分类,但是分类不会重复。也就是说:
- Year Mem_ID Cat_Code
- 2011 A0001 A
- 2011 A0001 B
- 2010 A0001 A
- ...
复制代码 我想问的是,是否能够直接以一个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。 |
|
|
|
|
|
|
|
|
|
|
发表于 18-6-2011 04:29 PM
|
显示全部楼层
如在 MSSQL 我会用
- if not exists(Select * From Cat_table Where Year=2011 AND Mem_ID='A0001' AND Cat_Code='A')
- insert into Cat_table values(2011,'A0001','A')
复制代码 MySQL 好像可以用
- if (Select * From Cat_table Where Year=2011 AND Mem_ID='A0001' AND Cat_Code='A') is null then
- insert into Cat_table values(2011,'A0001','A')
- 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
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|

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