SQL server2008报:已更新或者删除的行值要么不能使该行成为唯一行...

时间:2022-10-07 15:02:56
在sql  server2005和2008中,对于表A,创建了表A的触发器,从客户端打开表A,右键删除某一行记录时,弹出:已更新或者删除的行值要么不能使该行成为唯一行,要么改变了多行(2行),使用sql语句可以删除。请问这是什么原因?
注:
1、表中记录没有重复
2、在sql server2000中则可以右键删除,即没有上述现象。

30 个解决方案

#1


表中记录没有重复

#2


没遇到过,你可以看看是不是触发器的问题

#4


应该是触发器问题,你仔细看看你的删除语句,max(字段)
根据这个条件删除的可能不只一条记录...

#5


不是触发器的问题,是这样的:
你使用图形化界面删除时,实际是生成了一条DELETE语句执行,如果你选择删除的记录在表中有一行或多行和它完全相同的记录,那用语句删除的就会是所有相同的记录,最终的结果就是你点一条删除,结果删了多条。所以MSSQL对这种情况就报个错,让你用语句删除。

#6


引用 5 楼 sharon_liu 的回复:
不是触发器的问题,是这样的:
你使用图形化界面删除时,实际是生成了一条DELETE语句执行,如果你选择删除的记录在表中有一行或多行和它完全相同的记录,那用语句删除的就会是所有相同的记录,最终的结果就是你点一条删除,结果删了多条。所以MSSQL对这种情况就报个错,让你用语句删除。
表中没有重复的记录

#7


引用 6 楼 wudeaaa 的回复:
引用 5 楼 sharon_liu 的回复:
不是触发器的问题,是这样的:
你使用图形化界面删除时,实际是生成了一条DELETE语句执行,如果你选择删除的记录在表中有一行或多行和它完全相同的记录,那用语句删除的就会是所有相同的记录,最终的结果就是你点一条删除,结果删了多条。所以MSSQL对这种情况就报个错,让你用语句删除。
表中没有重复的记录

肯定是这个原因没错,至于记录的合法性你自己验证就行了。这种情况除非表中的非法记录都没有了,不然不能用图形化界面删除的,只能用语句。
你可以用语句判断一下有没有重复记录
SELECT COUNT(1) FROM [表名]
SELECT COUNT(1) FROM (SELECT DISTINCT * FROM [表名]) T
如果一致说明没有重复记录

#8


引用 6 楼 wudeaaa 的回复:
引用 5 楼 sharon_liu 的回复:
不是触发器的问题,是这样的:
你使用图形化界面删除时,实际是生成了一条DELETE语句执行,如果你选择删除的记录在表中有一行或多行和它完全相同的记录,那用语句删除的就会是所有相同的记录,最终的结果就是你点一条删除,结果删了多条。所以MSSQL对这种情况就报个错,让你用语句删除。
表中没有重复的记录

楼主看三楼。

#9


引用 8 楼 sql_hhy 的回复:
引用 6 楼 wudeaaa 的回复:

引用 5 楼 sharon_liu 的回复:
不是触发器的问题,是这样的:
你使用图形化界面删除时,实际是生成了一条DELETE语句执行,如果你选择删除的记录在表中有一行或多行和它完全相同的记录,那用语句删除的就会是所有相同的记录,最终的结果就是你点一条删除,结果删了多条。所以MSSQL对这种情况就报个错,让你用语句删除。
表中没有重复的记录
……

三楼的方法有限制条件,比如有自增列时用插入会受影响等,需要看具体情况

#10


引用 8 楼 sql_hhy 的回复:
引用 6 楼 wudeaaa 的回复:

引用 5 楼 sharon_liu 的回复:
不是触发器的问题,是这样的:
你使用图形化界面删除时,实际是生成了一条DELETE语句执行,如果你选择删除的记录在表中有一行或多行和它完全相同的记录,那用语句删除的就会是所有相同的记录,最终的结果就是你点一条删除,结果删了多条。所以MSSQL对这种情况就报个错,让你用语句删除。
表中没有重复的记录
……
结果是一致的

#11


引用 10 楼 wudeaaa 的回复:
引用 8 楼 sql_hhy 的回复:
引用 6 楼 wudeaaa 的回复:

引用 5 楼 sharon_liu 的回复:
不是触发器的问题,是这样的:
你使用图形化界面删除时,实际是生成了一条DELETE语句执行,如果你选择删除的记录在表中有一行或多行和它完全相同的记录,那用语句删除的就会是所有相同的记录,最终的结果就是你点一条删除,结果删了多条。所以MSSQL对这种情况就报个错……

那就改用语句删除,DELETE FROM TB WHER COL1=.. AND COL2=.. AND ... AND COLN=..把所有列的值都写上就可以了。

#12


现在该表中的记录只能添加,修改时也会报同样的信息。该表没有主键,总共记录只有几条,确认是没有重复的记录。

#13


引用 11 楼 sharon_liu 的回复:
引用 10 楼 wudeaaa 的回复:

引用 8 楼 sql_hhy 的回复:
引用 6 楼 wudeaaa 的回复:

引用 5 楼 sharon_liu 的回复:
不是触发器的问题,是这样的:
你使用图形化界面删除时,实际是生成了一条DELETE语句执行,如果你选择删除的记录在表中有一行或多行和它完全相同的记录,那用语句删除的就会是所有相同的记录,最终的结果就是你点一条删除,……
使用sql语句是可以删除的,就是不知道是什么原因造成的。

#14


顶一个

#15


帮顶一下

#16


求救啊 ,这个是不是Sql Server2005的bug?

#17


楼主可以向ms发信求奖励了,呵呵。。。挺奇怪的问题

#18


这个大家知道是什么原因吗?

#19


顶啦顶啦

#20


应该是个BUG,帮顶。

#21


该回复于2010-11-03 13:28:37被版主删除

#22


在表A上建一个主键就可以,我也碰到这情况,好久才解决,希望对你有帮助

#23


引用 22 楼 steven_0825 的回复:
在表A上建一个主键就可以,我也碰到这情况,好久才解决,希望对你有帮助
谢谢啊,这是没有主键造成的?

#24


我也遇到相同的问题

#25


22楼,威武!!!

#26


引用 22 楼 steven_0825 的回复:
在表A上建一个主键就可以,我也碰到这情况,好久才解决,希望对你有帮助

OK

#27


你先确认有表中有重复的数据没有,我刚刚也遇到了这个问题,我的原因是表中有重复的数据,表中没有设置主键,要是你的问题和我的问题,若果一样的话,可以考虑在表中删除重复数据,新增一个主键

#28


加了主键,每行有个索引信息,图形界面删的时候可以根据索引信息去进行删除,所以可以正常定位行。而如果没有索引,它没法定位行,为了保证数据安全,所以不允许你删除。这个不应该算是BUG,反而应该算是微软的对数据安全的一个优化……

#29


顶,果然是建了主键就好了。这个问题查了半天,都晕了。

#30


我也遇到这个问题,困惑好久了,也建了主键了,还是不行呢

#1


表中记录没有重复

#2


没遇到过,你可以看看是不是触发器的问题

#3


#4


应该是触发器问题,你仔细看看你的删除语句,max(字段)
根据这个条件删除的可能不只一条记录...

#5


不是触发器的问题,是这样的:
你使用图形化界面删除时,实际是生成了一条DELETE语句执行,如果你选择删除的记录在表中有一行或多行和它完全相同的记录,那用语句删除的就会是所有相同的记录,最终的结果就是你点一条删除,结果删了多条。所以MSSQL对这种情况就报个错,让你用语句删除。

#6


引用 5 楼 sharon_liu 的回复:
不是触发器的问题,是这样的:
你使用图形化界面删除时,实际是生成了一条DELETE语句执行,如果你选择删除的记录在表中有一行或多行和它完全相同的记录,那用语句删除的就会是所有相同的记录,最终的结果就是你点一条删除,结果删了多条。所以MSSQL对这种情况就报个错,让你用语句删除。
表中没有重复的记录

#7


引用 6 楼 wudeaaa 的回复:
引用 5 楼 sharon_liu 的回复:
不是触发器的问题,是这样的:
你使用图形化界面删除时,实际是生成了一条DELETE语句执行,如果你选择删除的记录在表中有一行或多行和它完全相同的记录,那用语句删除的就会是所有相同的记录,最终的结果就是你点一条删除,结果删了多条。所以MSSQL对这种情况就报个错,让你用语句删除。
表中没有重复的记录

肯定是这个原因没错,至于记录的合法性你自己验证就行了。这种情况除非表中的非法记录都没有了,不然不能用图形化界面删除的,只能用语句。
你可以用语句判断一下有没有重复记录
SELECT COUNT(1) FROM [表名]
SELECT COUNT(1) FROM (SELECT DISTINCT * FROM [表名]) T
如果一致说明没有重复记录

#8


引用 6 楼 wudeaaa 的回复:
引用 5 楼 sharon_liu 的回复:
不是触发器的问题,是这样的:
你使用图形化界面删除时,实际是生成了一条DELETE语句执行,如果你选择删除的记录在表中有一行或多行和它完全相同的记录,那用语句删除的就会是所有相同的记录,最终的结果就是你点一条删除,结果删了多条。所以MSSQL对这种情况就报个错,让你用语句删除。
表中没有重复的记录

楼主看三楼。

#9


引用 8 楼 sql_hhy 的回复:
引用 6 楼 wudeaaa 的回复:

引用 5 楼 sharon_liu 的回复:
不是触发器的问题,是这样的:
你使用图形化界面删除时,实际是生成了一条DELETE语句执行,如果你选择删除的记录在表中有一行或多行和它完全相同的记录,那用语句删除的就会是所有相同的记录,最终的结果就是你点一条删除,结果删了多条。所以MSSQL对这种情况就报个错,让你用语句删除。
表中没有重复的记录
……

三楼的方法有限制条件,比如有自增列时用插入会受影响等,需要看具体情况

#10


引用 8 楼 sql_hhy 的回复:
引用 6 楼 wudeaaa 的回复:

引用 5 楼 sharon_liu 的回复:
不是触发器的问题,是这样的:
你使用图形化界面删除时,实际是生成了一条DELETE语句执行,如果你选择删除的记录在表中有一行或多行和它完全相同的记录,那用语句删除的就会是所有相同的记录,最终的结果就是你点一条删除,结果删了多条。所以MSSQL对这种情况就报个错,让你用语句删除。
表中没有重复的记录
……
结果是一致的

#11


引用 10 楼 wudeaaa 的回复:
引用 8 楼 sql_hhy 的回复:
引用 6 楼 wudeaaa 的回复:

引用 5 楼 sharon_liu 的回复:
不是触发器的问题,是这样的:
你使用图形化界面删除时,实际是生成了一条DELETE语句执行,如果你选择删除的记录在表中有一行或多行和它完全相同的记录,那用语句删除的就会是所有相同的记录,最终的结果就是你点一条删除,结果删了多条。所以MSSQL对这种情况就报个错……

那就改用语句删除,DELETE FROM TB WHER COL1=.. AND COL2=.. AND ... AND COLN=..把所有列的值都写上就可以了。

#12


现在该表中的记录只能添加,修改时也会报同样的信息。该表没有主键,总共记录只有几条,确认是没有重复的记录。

#13


引用 11 楼 sharon_liu 的回复:
引用 10 楼 wudeaaa 的回复:

引用 8 楼 sql_hhy 的回复:
引用 6 楼 wudeaaa 的回复:

引用 5 楼 sharon_liu 的回复:
不是触发器的问题,是这样的:
你使用图形化界面删除时,实际是生成了一条DELETE语句执行,如果你选择删除的记录在表中有一行或多行和它完全相同的记录,那用语句删除的就会是所有相同的记录,最终的结果就是你点一条删除,……
使用sql语句是可以删除的,就是不知道是什么原因造成的。

#14


顶一个

#15


帮顶一下

#16


求救啊 ,这个是不是Sql Server2005的bug?

#17


楼主可以向ms发信求奖励了,呵呵。。。挺奇怪的问题

#18


这个大家知道是什么原因吗?

#19


顶啦顶啦

#20


应该是个BUG,帮顶。

#21


该回复于2010-11-03 13:28:37被版主删除

#22


在表A上建一个主键就可以,我也碰到这情况,好久才解决,希望对你有帮助

#23


引用 22 楼 steven_0825 的回复:
在表A上建一个主键就可以,我也碰到这情况,好久才解决,希望对你有帮助
谢谢啊,这是没有主键造成的?

#24


我也遇到相同的问题

#25


22楼,威武!!!

#26


引用 22 楼 steven_0825 的回复:
在表A上建一个主键就可以,我也碰到这情况,好久才解决,希望对你有帮助

OK

#27


你先确认有表中有重复的数据没有,我刚刚也遇到了这个问题,我的原因是表中有重复的数据,表中没有设置主键,要是你的问题和我的问题,若果一样的话,可以考虑在表中删除重复数据,新增一个主键

#28


加了主键,每行有个索引信息,图形界面删的时候可以根据索引信息去进行删除,所以可以正常定位行。而如果没有索引,它没法定位行,为了保证数据安全,所以不允许你删除。这个不应该算是BUG,反而应该算是微软的对数据安全的一个优化……

#29


顶,果然是建了主键就好了。这个问题查了半天,都晕了。

#30


我也遇到这个问题,困惑好久了,也建了主键了,还是不行呢