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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于sql server“键列信息不足或不正确。更新影响到多行”的主要内容,如果未能解决你的问题,请参考以下文章

ms sql2012 能否安装在win2008 server

Sql server2008! SQL server服务无法启动,并显示错误17113, 修复Sql server2008失败!

sql server 的考证问题

求sql server帮助文档

已安装 SQL Server 2005,安装 SQL Server 2008 时提示需要删除 SQL Server 2005 Express 工具

server 2008 r2能安装sql server 2016吗?