SQL设置 IGNORE_DUP_KEY 报错问题

weinikuaile 2019-07-03 11:03:44
脚本如下:
create table #s(nGoodsID numeric(10) primary key)
CREATE UNIQUE NONCLUSTERED INDEX [txxfDaily_idx] ON #s
(
nGoodsID
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = ON, DROP_EXISTING = OFF,
ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON,
STATISTICS_NORECOMPUTE =off) ON [PRIMARY]
GO
SET ANSI_WARNINGS on
insert into #s select 1
union all
select 1

drop table #s

警告如下:
已忽略重复的键。

(0 行受影响)

--
...全文
1337 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
weinikuaile 2019-07-03
  • 打赏
  • 举报
回复
这样效率不行
二月十六 2019-07-03
  • 打赏
  • 举报
回复
引用 3 楼 weinikuaile 的回复:
[quote=引用 2 楼 二月十六 的回复:] 这个需求有点不对啊,主键为啥要插入相同的数据呢?试试这样行吗?
create table #s(nGoodsID numeric(10) )
CREATE  NONCLUSTERED INDEX [txxfDaily_idx] ON #s
(
nGoodsID
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF,
 SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = off, DROP_EXISTING = OFF,
  ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON,
  STATISTICS_NORECOMPUTE =off) ON [PRIMARY]
GO 
SET ANSI_WARNINGS on
    insert into #s select 1 
    union all
    select 1

  
drop table #s
先表示感谢: IGNORE_DUP_KEY = ON 这个是故意这样设定的,这只是个例子,主键就是nGoodsID,假定 插入2条一样的数据,自动忽略其中一条的主键,目前的问题是怎样避免程序抓出这样的SQL错误,目前用SQL2014在低版(win7/xp)下可能会报错,其它(win10则不会弹出警告报错对话框),试了try catch 捕捉不到该错误,因此不能像楼主那样设定了。[/quote] 试试用instead of insert触发器呢,先判断是否已有该数据,有的话不处理,没有的话插入。
weinikuaile 2019-07-03
  • 打赏
  • 举报
回复
引用 2 楼 二月十六 的回复:
这个需求有点不对啊,主键为啥要插入相同的数据呢?试试这样行吗?
create table #s(nGoodsID numeric(10) )
CREATE NONCLUSTERED INDEX [txxfDaily_idx] ON #s
(
nGoodsID
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = off, DROP_EXISTING = OFF,
ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON,
STATISTICS_NORECOMPUTE =off) ON [PRIMARY]
GO
SET ANSI_WARNINGS on
insert into #s select 1
union all
select 1


drop table #s


先表示感谢: IGNORE_DUP_KEY = ON 这个是故意这样设定的,这只是个例子,主键就是nGoodsID,假定 插入2条一样的数据,自动忽略其中一条的主键,目前的问题是怎样避免程序抓出这样的SQL错误,目前用SQL2014在低版(win7/xp)下可能会报错,其它(win10则不会弹出警告报错对话框),试了try catch 捕捉不到该错误,因此不能像楼主那样设定了。
二月十六 2019-07-03
  • 打赏
  • 举报
回复
这个需求有点不对啊,主键为啥要插入相同的数据呢?试试这样行吗?
create table #s(nGoodsID numeric(10) )
CREATE  NONCLUSTERED INDEX [txxfDaily_idx] ON #s
(
nGoodsID
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF,
 SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = off, DROP_EXISTING = OFF,
  ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON,
  STATISTICS_NORECOMPUTE =off) ON [PRIMARY]
GO 
SET ANSI_WARNINGS on
    insert into #s select 1 
    union all
    select 1

  
drop table #s
weinikuaile 2019-07-03
  • 打赏
  • 举报
回复
问题:如何避免被程序抓出报已忽略重复的键的错误?
唐诗三百首 2019-07-03
  • 打赏
  • 举报
回复
可以在前端程序中做个特殊处理, 如果需显示内容刚好为"已忽略重复的键"时, 则不予显示即可. 例如.Replace("已忽略重复的键", "");

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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