insert into 插入数据时是如何忽略掉错误

csdn_风中雪狼 2013-11-22 01:37:37
有一张表 ,如下所示
create table test
(
xh char(6),--人员序号
worktime datetime, --打卡时间
machineid char(2) --考勤机编号
)
xh 与 worktime 为联合主键

每次从考勤机中将考勤时间下载下来,每次下载完成后,考勤机中的记录不一定会进行清空,
所以就会导致有些考勤时间在数据库会重复存在,在执行插入操作时就会失败(主键重复了)
现在的方法是在程序中判断是否有重复的记录,但是这样的效率太低,数据量太大,
那么如何忽略掉这个错误,继续执行后面的插入语句,
...全文
2153 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2013-11-22
  • 打赏
  • 举报
回复
引用 16 楼 lzxue1989 的回复:
[quote=引用 15 楼 DBA_Huangzj 的回复:] 你要这样的话只能把主键取消
就是的,我在试看看,谢谢[/quote] 另外,如果有外键 引用这个表的主键,可能会导致,主键删除不掉,这个时候需要先把外键给删除掉。
csdn_风中雪狼 2013-11-22
  • 打赏
  • 举报
回复
引用 15 楼 DBA_Huangzj 的回复:
你要这样的话只能把主键取消
就是的,我在试看看,谢谢
發糞塗牆 2013-11-22
  • 打赏
  • 举报
回复
你要这样的话只能把主键取消
發糞塗牆 2013-11-22
  • 打赏
  • 举报
回复
因为主键本来就必须唯一,所以改不了,只能该非主键的索引
csdn_风中雪狼 2013-11-22
  • 打赏
  • 举报
回复

改不了
發糞塗牆 2013-11-22
  • 打赏
  • 举报
回复
解释: Specifies the error response when an insert operation attempts to insert duplicate key values into a unique index. The IGNORE_DUP_KEY option applies only to insert operations after the index is created or rebuilt. The option has no effect when executing CREATE INDEX, ALTER INDEX, or UPDATE. The default is OFF.
csdn_风中雪狼 2013-11-22
  • 打赏
  • 举报
回复
引用 8 楼 DBA_Huangzj 的回复:
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON <object> ( column [ ASC | DESC ] [ ,...n ] ) [ INCLUDE ( column_name [ ,...n ] ) ] [ WHERE <filter_predicate> ] [ WITH ( <relational_index_option> [ ,...n ] ) ] [ ON { partition_scheme_name ( column_name ) | filegroup_name | default } ] [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ] [ ; ] <object> ::= { [ database_name. [ schema_name ] . | schema_name. ] table_or_view_name } <relational_index_option> ::= { PAD_INDEX = { ON | OFF } | FILLFACTOR = fillfactor | SORT_IN_TEMPDB = { ON | OFF } | IGNORE_DUP_KEY = { ON | OFF } | STATISTICS_NORECOMPUTE = { ON | OFF } | DROP_EXISTING = { ON | OFF } | ONLINE = { ON | OFF } | ALLOW_ROW_LOCKS = { ON | OFF } | ALLOW_PAGE_LOCKS = { ON | OFF } | MAXDOP = max_degree_of_parallelism | DATA_COMPRESSION = { NONE | ROW | PAGE} [ ON PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) ] }
谢谢,我测试下
LongRui888 2013-11-22
  • 打赏
  • 举报
回复
引用 2 楼 lzxue1989 的回复:
mysql 有 insert ignore into 这个关键字 他这样,当违背了唯一约束的时候~就会直接跳过,不会报错。 不知道 ms sql 是否有这样的关键字
sql server没有这个。 在sql server 就把主键删掉把,就不会报错了。
csdn_风中雪狼 2013-11-22
  • 打赏
  • 举报
回复
引用 3 楼 rockyljt 的回复:
使用not exists来判断啊

--比如
insert into test
select '123456',getdate(),'01'
from test t1
where not exists(select 1 from test t2 where t2.xh='123456' and t2.worktime=getdate())
这样不是很理想,数据量太大了,有没有类似my sql中 的 insert ignore into 关键字,就算主键重复了他就忽略掉,继续执行后面的语句
發糞塗牆 2013-11-22
  • 打赏
  • 举报
回复
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON <object> ( column [ ASC | DESC ] [ ,...n ] ) [ INCLUDE ( column_name [ ,...n ] ) ] [ WHERE <filter_predicate> ] [ WITH ( <relational_index_option> [ ,...n ] ) ] [ ON { partition_scheme_name ( column_name ) | filegroup_name | default } ] [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ] [ ; ] <object> ::= { [ database_name. [ schema_name ] . | schema_name. ] table_or_view_name } <relational_index_option> ::= { PAD_INDEX = { ON | OFF } | FILLFACTOR = fillfactor | SORT_IN_TEMPDB = { ON | OFF } | IGNORE_DUP_KEY = { ON | OFF } | STATISTICS_NORECOMPUTE = { ON | OFF } | DROP_EXISTING = { ON | OFF } | ONLINE = { ON | OFF } | ALLOW_ROW_LOCKS = { ON | OFF } | ALLOW_PAGE_LOCKS = { ON | OFF } | MAXDOP = max_degree_of_parallelism | DATA_COMPRESSION = { NONE | ROW | PAGE} [ ON PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) ] }
發糞塗牆 2013-11-22
  • 打赏
  • 举报
回复
CREATE INDEX 语法中有:IGNORE_DUP_KEY 的选项
---涛声依旧--- 2013-11-22
  • 打赏
  • 举报
回复
建议楼主用另外一个临时固定表(tblTemp)来存储考勤机上的打卡记录 先从考勤机里下载到tblTemp(下载前清空此表)后再将其未重复的记录插入到你的打卡记录表test里去
Landa_Peter 2013-11-22
  • 打赏
  • 举报
回复
如果要更新已有的记录,很麻烦(或者说效率很低),我以前用类似的方法做过,我用INSERT INTO ... VALUE ...一条一条插入, 检错时如果发现是重复主键错误,则先删除这条记录, 再resume, 即重新插入. 慢就慢在删除时又整个表找了一遍,我试了四千条重复的插入,用insert into ... select到一个新表,只要几秒钟,而用先删除重复再插入的方法, 时间约用了1分钟!
csdn_风中雪狼 2013-11-22
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
你加判断就是为了去除重复,那不管错误继续执行不就失去了原来的意义吗?主键、唯一约束都能避免,不过一样有开销。
这个错误一般都是数据重复造成的,现在是程序端进行判断,但是效率太低
---涛声依旧--- 2013-11-22
  • 打赏
  • 举报
回复
使用not exists来判断啊

--比如
insert into test
select '123456',getdate(),'01'
from test t1
where not exists(select 1 from test t2 where t2.xh='123456' and t2.worktime=getdate())
csdn_风中雪狼 2013-11-22
  • 打赏
  • 举报
回复
mysql 有 insert ignore into 这个关键字 他这样,当违背了唯一约束的时候~就会直接跳过,不会报错。 不知道 ms sql 是否有这样的关键字
發糞塗牆 2013-11-22
  • 打赏
  • 举报
回复
你加判断就是为了去除重复,那不管错误继续执行不就失去了原来的意义吗?主键、唯一约束都能避免,不过一样有开销。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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