sql server“键列信息不足或不正确。更新影响到多行”

环境:windows server 2003 sp2,sql server 2000,用于管理固定资产的软件。

故障现象:

要同时增加两台思科交换机的固定资产信息,由于型号什么都一致,只是序列号不一样。于是就想做完一台后,能否直接复制一条单据过来改一下不一致的地方就行了。但是前台无法实现。本着偷懒和学习的态度,杀到后台,直接打开数据库操作。 去了主键限制,用下面语句复制:

INSERT INTO da111

SELECT *

FROM da111

WHERE (scodel = ‘03-ne-076‘)

复制完后,在结果列表中找到新复制的行,直接手动修改主键ID,想让两条语句有所区别。此时,只要鼠标点击此行以外其他地方,就提示“键列信息不足或不正确。更新影响到多行”,如下:

比较崩溃的是,不管是再重装改回原来的ID值(还原成两行一模一样),或者用删除语句删除重复,都会弹出如上警告,只有从右上角整个关闭查询分析器窗口,才能进行其他的操作。

原因分析:

不管是用语句,还是用鼠标直接在表格里选中修改,其实都是update。对数据库来说,此时等于是对两条一模一样的行进行修改,对SQL SERVER来是不允许的。所以就会有如上提示。

那么对ORACLE来说会不会因为有ROWID的存在,就允许看上去一模一样的行修改呢?晚点测试一下。

解决方法:

知道原因,解决办法就好找了。

方法1.删除所有的重复行,重新手动一条条做!注意,需要关闭窗口重新打开查询分析器窗口来运行语句:

DELETE FROM da111_bak2   --也可以直接用delete da111_bak2,不加from

WHERE (scodel = ‘03-ne-076‘)

检查表相关性的时候,可以用以下窗口来检查。但是只能检查过程、触发器之类的,如果是被别的表引用,似乎检查不出来,所以,用此方法既麻烦又不安全。

方法3.先删除表中主键约束,再复制行,然后用限定影响行数的方式修改其中的一行的ID,然后恢复主键约束。此法很棒,推荐

--查询约束名,并删除约束
exec sp_helpconstraint ‘da111_bak2‘
alter table da111_bak2
drop
constraint pk_da111_bak2
--复制行
INSERT  da111_bak2
SELECT *
FROM da111_bak2
WHERE (scodel = ‘03-ne-076‘)
/*设置影响的行数,此处复制了一次,只设置1,如果复制了多次共有n行重复,想最后只保留一行不被影响,则设置为n-1*/
SET ROWCOUNT 1
--更新其中的1行,将ID值更改。
update da111_bak2
set id=‘14824553714603914625651755433750‘ --设置一个不同的值
WHERE (scodel = ‘03-ne-076‘)
--还原设置S
ET ROWCOUNT 0-
-恢复主键约束
alter table da111_bak2
add
constraint pk_da111_bak2
primary key (id)

参考:http://blog.163.com/m13864039250_1/blog/static/21386524820133155536227/

http://blog.sina.com.cn/s/blog_415b73d101000838.html

时间: 2024-11-05 02:47:30

sql server“键列信息不足或不正确。更新影响到多行”的相关文章

Sql Server 2005 统计信息用途

1, 什么是统计信息 以下是官方的对统计信息的描述: 按照默认设置,如果表中的某列没有索引,则SQL Server会自动为该列创建统计.然后,查询优化器评估该列中数据分布范围的统计信息,以选择一个更为有效的查询处理方案.分辨自动创建的统计很简单,在SQL Server 7.0和SQL Server 2000中,自动创建的统计的前缀为_WA_Sys. 个人感想: 以前对_WA_Sys开头的统计信息一直不知道有什么用,在学习了oracle时的CBO和三个算法(嵌套循环,合并连接和hash连接)才发现

SQL Server 中统计信息直方图中对于没有覆盖到谓词预估以及预估策略的变化(SQL2012-->SQL2014-->SQL2016)

原文:SQL Server 中统计信息直方图中对于没有覆盖到谓词预估以及预估策略的变化(SQL2012-->SQL2014-->SQL2016) 本文出处:http://www.cnblogs.com/wy123/p/6770258.html 统计信息写过几篇了相关的文章了,感觉还是不过瘾,关于统计信息的问题,最近又踩坑了,该问题虽然不算很常见,但也比较有意思.相对SQL Server 2012,发现在新的SQL Server版本(2014,2016)中都有一些明显的变化,下文将对此进行粗浅的

SQL Server 查找统计信息的采样时间与采样比例

原文:SQL Server 查找统计信息的采样时间与采样比例 有时候我们会遇到,由于统计信息不准确导致优化器生成了一个错误的执行计划(或者这样表达:一个较差的执行计划),从而引起了系统性能问题.那么如果我们怀疑这个错误的执行计划是由于统计信息不准确引起的.那么我们如何判断统计信息不准确呢?当然首先得去查看实际执行计划中,统计信息的相关数据是否与实际情况有较大的出入,下面我们抛开这个大命题,仅仅从统计信息层面去查看统计信息的更新时间,统计信息的采样行数.采样比例等情况. 1:首先,我们要查查统计信

sql server 查看列备注、类型、字段大小

select 列名 = a.name ,类型 = c.name ,长度 = columnproperty(a.id,a.name,'precision') ,备注 = g.value from syscolumns a left join sysobjects b on a.id=b.id left join systypes c on a.xusertype = c.xusertype left join sysproperties g on a.id =g.id and a.colid =g

重置sql server标识列

sql server标识列是大家非常熟悉的了,下面为您介绍了sql server标识列重置的一些知识,如果您对sql server标识列方面感兴趣的话,不妨一看. 1.删除表内所有值并重置标识值 TRUNCATE TABLE TableName 2.保持表的内容,并重置自动编号列的SEED DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value) 如dbcc checkident ("bc_pos",reseed,1)即可,但如果

如何有效抓取SQL Server的BLOCKING信息

原文:如何有效抓取SQL Server的BLOCKING信息 转自:微软亚太区数据库技术支持组 官方博客 http://blogs.msdn.com/b/apgcdsd/archive/2011/12/12/sql-server-blocking.aspx SQL Server允许并发操作,BLOCKING是指在某一操作没有完成之前,其他操作必须等待,以便于保证数据的完整性.BLOCKING的解决方法要查看BLOCKING的头是什么,为什么BLOCKING头上的语句执行的很慢.通常来讲只要我们能

SQL Server删除表信息的三种方法

1.使用DELETE实现SQL Server删除表信息 (1)删除表中的全部信息 USE student GO DELETE student      --不加where条件,删除表中的所有记录 go (2)删除表中符合条件的记录 USE student GO DELETE student where Id='001'    --删除表中符合条件的记录 GO 2.使用TRUNCATE删除表中的信息 USE student GO TRUNCATE TABLE    student   --删除表中

Mysql与sql server的列的合并

Mysql SELECT concat(列1,列2) Nmae from 表名 sql server SELECT 列1+"|"+列2 Nmae from 表名 或者 union all

SQL Server附加数据库出现错误5123的正确解决方法

SQL Server附加数据库出现错误5123的正确解决方法 因为自己有一本基于SQL Server 2005的数据库教程,里边使用的示例数据库是AdventureWorks for SQL Server 2005,而我的机子上装的是SQL Server 2008,示例数据库是AdventureWorks for SQL Server 2008.起初我以为示例数据库AdventureWorks for SQL Server 2005 与AdventureWorks for SQL Server