sqlserver7.0数据库问题,请帮忙

xyzliuin 2003-09-06 01:37:29
CREATE TABLE [ld].[l_zwd_kc] (
[bill_no] [varchar] (18) NULL ,
[kc_id] [numeric](18, 0) NULL ,
[kc_sl] [numeric](12, 3) NULL ,
[if_fk] [char] (1) NULL ,
[hk_sl] [decimal](18, 5) NULL ,
[hk_je] [decimal](18, 5) NULL ,
[bill_d_no] [varchar] (18) NULL ,
[kf] [varchar] (10) NULL ,
[hwgz] [varchar] (10) NULL ,
[ph] [varchar] (20) NULL ,
[yxqz] [datetime] NULL ,
[zb] [int] NULL ,
[bz] [int] NULL ,
[cpmc] [varchar] (40) NULL ,
[cp_no] [varchar] (15) NULL ,
[gg] [varchar] (20) NULL ,
[cd] [varchar] (60) NULL ,
[jldw] [varchar] (4) NULL ,
[dj] [numeric](13, 5) NULL
) ON [PRIMARY]
GO
以上是我的表结构,没有任何主键。
但我在删除其中某一条纪录时,提示“键列信息不足或不正确。更新影响到更多的行”。
这条数据在表中有两条一模一样的,但是我没有设主键,应该没有问题,怎么回事??
我知道用delete语句可删除,但我要保留其中一条。
大侠门帮忙!
...全文
34 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2003-09-06
  • 打赏
  • 举报
回复
如果你确实要删除其中一条,可以用下面的两种方法:

1.在查询分析器中执行
alter table [ld].[l_zwd_kc] add id int identity(1,1) --添加标识列
select * form [ld].[l_zwd_kc] --查看你要删除记录的id号
delete from [ld].[l_zwd_kc] where id=xx --xx为id号
alter table [ld].[l_zwd_kc] drop column id --删除标识列.


2.
select distinct * into #tb from [ld].[l_zwd_kc] --将不重复的数据保存到临时表
truncate table [ld].[l_zwd_kc]达式 --清空原表数据
insert into [ld].[l_zwd_kc] select * from #tb --将不重复数据导回到原表
drop table #tb --删除原表
zjcxc 元老 2003-09-06
  • 打赏
  • 举报
回复
当表中有两条完全相同的记录时,删除会出现上面的错误,包括在2000中也如此.

原因是因为无法具体删除的是那一条.


所以,如果表中无主键,最好也在表中加一个标识字段,做为表的主键.
smallroad 2003-09-06
  • 打赏
  • 举报
回复
高手如云
pengdali 2003-09-06
  • 打赏
  • 举报
回复
应为你有完全相同的两条记录,你要删掉它们。

用这个:
select distinct * into #temp from 表
truncate table 表
insert 表 select * from #temp
drop table #temp

或:
alter table 表 add newfield int identity(1,1)

delete 表
where newfield not in(
select min(newfield) from 表 group by 除newfield外的所有字段
)

alter table 表 drop column newfield
txlicenhe 2003-09-06
  • 打赏
  • 举报
回复
就因为没有主键,SQL不知道要删除哪一条,所以提示 “键列信息不足或不正确。更新影响到更多的行”。

蚂蚁的:去除重复值
如果有ID字段,就是具有唯一性的字段

delect table where id not in (

select max(id) from table group by col1,col2,col3...
)
group by 子句后跟的字段就是你用来判断重复的条件,如只有col1,那么只要col1字段内容相同即表示记录相同。



2,如果是判断所有字段也可以这样
select * into #aa from table group by id1,id2,....
delete table
insert into table
select * from #aa



3,没有ID的情况

select identity(int,1,1) as id,* into #temp from tabel
delect # where id not in (
select max(id) from # group by col1,col2,col3...)
delect table
inset into table(...)
select ..... from #temp


col1+','+col2+','...col5 联合主键


select * from table where col1+','+col2+','...col5 in (

select max(col1+','+col2+','...col5) from table
where having count(*)>1
group by col1,col2,col3,col4
)
group by 子句后跟的字段就是你用来判断重复的条件,如只有col1,那么只要col1字段内容相同即表示记录相同。

2,
select identity(int,1,1) as id,* into #temp from tabel
select * from #temp where id in (
select max(id) from #emp where having count(*)>1 group by col1,col2,col3...)

34,874

社区成员

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

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