SQL 插入重复记录时的问题

INSERTINTOIPBlack([From],[To],Mask)SELECTdistinctip_start,ip_finish,maskFROMIPCheckWH... INSERT INTO IPBlack ([From], [To],Mask) SELECT distinct ip_start,ip_finish,mask FROM IPCheck WHERE IPCheck.ip_start is not null AND IPCheck.[Add]=FALSE
这条语句的作用是将IPCheck表中的IP起始地址、IP结束地址和子网掩码这三项插入到IPBlack表中对应的From、To、Mask。要求是IPBlack中的记录不能有重复,From和To都设置为有索引不能重复。这样在一般情况下用 distinct 就能在插入时避免重复。但是当两条记录的ip_start相等,而ip_finish不同时,比如
ip_start ip_finish
68.128.0.0 68.131.255.255
68.128.0.0 68.255.255.255
就会造成插入错误,原因是From和To都设置为有索引不能重复,在插入时语句认为它们是2条不同的记录,但IPBlack的表属性设置却认为它是一条重复记录。
我想要的结果是当遇到这样相同的记录时能够插入ip_finish比较大的值(较大的IP结束地址已经包含了其它IP结束地址的范围)
请大家指教该如何写这条语句。
展开
 我来答
neu_hubs
2007-02-13 · TA获得超过196个赞
知道小有建树答主
回答量:169
采纳率:100%
帮助的人:266万
展开全部
可以先更新,如果更新条数是0,再进行插入,这样就不会报错了。

另:你忽略了 结束ip地址相同,但是 起始地址不同的情况;画图如下:
|----------------------|
|-------------------------------|
还有 from 比数据库中原有数据 小,同时 to 比数据库中原有数据 大;
|----------------------|
|---------------------------------|
还有就是 数据有交集的情况:
|----------------------|
|------------------|
或者:
|----------------------|
|------------------|

这个问题比较繁琐了,原因可能在于 IPBlack 的表的设计上,
所以一条sql语句估计搞不定了,
而且在 ip 地址字符串没有规范化前,恐怕没办法比较大小,
例如:
(68.128.0.0
132.131.255.255
如果从字符串的角度来比较 6>1,所以 68.128.0.0 > 132.131.255.255 )

你需要编个程序来实现你的需求了。
祝早日成功。:)
九方新霁025
2007-02-13 · 超过10用户采纳过TA的回答
知道答主
回答量:58
采纳率:0%
帮助的人:0
展开全部
坐沙发...不知道.......呼呼.......
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2007-02-15 · TA获得超过816个赞
知道小有建树答主
回答量:816
采纳率:0%
帮助的人:667万
展开全部
先写一个select语句,根据查询结果进行判断选择是插入还是更新
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友d1dedea
2007-02-15 · TA获得超过1122个赞
知道小有建树答主
回答量:702
采纳率:0%
帮助的人:647万
展开全部
这样可以保证ip_start不重复,但不保证ip_finish不重复:
INSERT INTO IPBlack ([From], [To],Mask)
SELECT ip_start,max(ip_finish) as ip_finish1,max(mask) as mask1
FROM IPCheck
WHERE IPCheck.ip_start is not null
AND IPCheck.[Add]=FALSE
group by ip_start

不知道你的sql是否支持这样的语法:
INSERT INTO IPBlack ([From], [To],Mask)
SELECT min(ip_start) as ip_start1,ip_finish1,max(mask1) as mask2
FROM
(SELECT ip_start,max(ip_finish) as ip_finish1,max(mask) as mask1
FROM IPCheck
WHERE IPCheck.ip_start is not null
AND IPCheck.[Add]=FALSE
group by ip_start) as a
group by ip_finish1

我用的是ORACLE9i的语法和函数,max()min()是取最大、小值函数。
不同的数据库支持的略有不同,你需要灵活一下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式