MySQL插入、更新问题

shootblue 2011-07-30 09:09:46
我有一个表,大概字段如下

客户ID 客户名称 客户姓名 联系方式 信息ID 信息来源

信息来源可能有好多种,

现在的问题是,我要向这表中插入数据(也就是从其他的表中复制数据过来),插入的时候需要先通过字段“信息ID、信息来源” 这两个字段判断一下是否存在 该来源的该信息,如果存在则更新其中的内容,如果不存在则直接插入新的数据。

信息ID 不是唯一值 可以有重复的值(但是通过 信息ID+信息来源 组合查询可以得到唯一值,也就是说通过这两个字段组合查询只能查出一条相关数据), 信息来源有两种可能 (1代表一种来源 2代表另一种来源)

请问有没有什么效率高的方法!?
...全文
98 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2011-07-30
  • 打赏
  • 举报
回复
[Quote]某一个字段的值有重复值也能设定为唯一索引?[/Quote]



create UNIQUE index xxxx on table1(col1,col2,col3)

如果仍不明白,建议看一下MYSQL官方免费手册。
shootblue 2011-07-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 acmain_chm 的回复:]

唯一索引,是可以由多个字段组成的。
[/Quote]
某一个字段的值有重复值也能设定为唯一索引?
ACMAIN_CHM 2011-07-30
  • 打赏
  • 举报
回复
唯一索引,是可以由多个字段组成的。
shootblue 2011-07-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 acmain_chm 的回复:]

引用信息ID 不是唯一值 可以有重复的值(但是通过 信息ID+信息来源 组合查询可以得到唯一值你的这句话是什么意思? 和你的引用信息ID、信息来源 这两个既不是主键也不是唯一值 矛盾啊!
[/Quote]

也就是说从不同的信息来源来的信息ID可能会重复,比如从来源1可能会过来一个ID为6的信息,那么从来源2可能也会过来一个ID为6的信息,这样一来信息ID就不是唯一值了。

之所以建立这个表的原因是因为,库中有好几个关于客户信息的表,使用者可以有选择的将这些客户信息移动到这个表中,等待以后处理。这样使用者删除其他带有客户信息的表中的条目是,就不会影响到这些移动出来的客户信息了。

但是要求不能重复移动,已经移动过来的客户信息,如果再次执行移动的时候只是修改对应的项目即可。

大概就是这个意思,也许我这个表结构联系的不好,有没有更好的解决办法呢?
ACMAIN_CHM 2011-07-30
  • 打赏
  • 举报
回复
[Quote]信息ID 不是唯一值 可以有重复的值(但是通过 信息ID+信息来源 组合查询可以得到唯一值[/Quote]你的这句话是什么意思? 和你的[Quote]信息ID、信息来源 这两个既不是主键也不是唯一值[/Quote] 矛盾啊!
shootblue 2011-07-30
  • 打赏
  • 举报
回复
由于不同来源的信息ID 可能会重复。,
shootblue 2011-07-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 acmain_chm 的回复:]

效率不会比你先查询判断再插入慢。
[/Quote]

还有个问题,这两个字段的数据都不是唯一值,会有重复值的,这样就没有办法定义唯一索引了吧。
ACMAIN_CHM 2011-07-30
  • 打赏
  • 举报
回复
效率不会比你先查询判断再插入慢。
shootblue 2011-07-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 acmain_chm 的回复:]

设置 (信息ID、信息来源 ) 为唯一键。然后使用
insert into .. on duplIcate update ...就行了。
[/Quote]
这种效率如何?数据量大了没啥问题吧?
ACMAIN_CHM 2011-07-30
  • 打赏
  • 举报
回复
设置 (信息ID、信息来源 ) 为唯一键。然后使用
insert into .. on duplIcate update ...就行了。
shootblue 2011-07-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nicenight 的回复:]

mysql 中,使用 replace into 语句代替 insert into 语句即可。
当然,也有 ON DUPLICATE 语句可以考虑,详细用法一查就有了。
[/Quote]

信息ID、信息来源 这两个既不是主键也不是唯一值,这样好像不行吧。
nicenight 2011-07-30
  • 打赏
  • 举报
回复
mysql 中,使用 replace into 语句代替 insert into 语句即可。
当然,也有 ON DUPLICATE 语句可以考虑,详细用法一查就有了。

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧