如何取消表主键的自增,该表的主键与其他表有关联关系!在线等待,马上给分!

liyin_first 2004-04-29 11:16:27
我得脚本如下:
alter table ArchiveDoc add id_bak bigint NULL
go
update ArchiveDoc set id_bak=DM1_ArchiveDocID
go
alter table ArchiveDoc drop column DM1_ArchiveDocID
go
exec sp_rename 'ArchiveDoc.id_bak','DM1_ArchiveDocID','COLUMN'
go

而DM1_ArchiveDocID自增,与其他3张表的某列有关联关系。因此执行的时候出错:

务器: 消息 5074,级别 16,状态 8,行 1
对象 'PK_ArchiveDocTable' 依赖于 列 'DM1_ArchiveDocID'。
服务器: 消息 5074,级别 16,状态 1,行 1
对象 'FK_ArchiveDocApprove_ArchiveDoc' 依赖于 列 'DM1_ArchiveDocID'。
服务器: 消息 5074,级别 16,状态 1,行 1
对象 'FK_ArchiveDocAttribute_ArchiveDoc1' 依赖于 列 'DM1_ArchiveDocID'。
服务器: 消息 5074,级别 16,状态 1,行 1
对象 'FK_ArchiveDocAttribute_ArchiveDoc' 依赖于 列 'DM1_ArchiveDocID'。
服务器: 消息 4922,级别 16,状态 1,行 1
ALTER TABLE DROP COLUMN DM1_ArchiveDocID 失败,因为有一个或多个对象访问此列。
服务器: 消息 15335,级别 11,状态 1,过程 sp_rename,行 342
错误: @newname 值 'DM1_ArchiveDocID' 已用作 COLUMN 名称,该值将导致重复,而这是不允许的。

请问各位老大应该如何写?谢谢
...全文
149 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyin_first 2004-04-30
  • 打赏
  • 举报
回复
现在错误 如下:
服务器: 消息 3733,级别 16,状态 2,行 6
约束 'FK_ArchiveDocAttribute_ArchiveDoc' 不属于表 'ArchiveDocAttribute'。
服务器: 消息 3727,级别 16,状态 1,行 6
未能除去约束。请参阅前面的错误信息。
服务器: 消息 3725,级别 16,状态 1,行 3
约束 'PK_ArchiveDocTable' 正由表 'ArchiveDocBaseAttribute' 的外键约束 'FK_ArchiveDocAttribute_ArchiveDoc' 引用。
服务器: 消息 3727,级别 16,状态 1,行 3
未能除去约束。请参阅前面的错误信息。
服务器: 消息 5074,级别 16,状态 8,行 1
对象 'PK_ArchiveDocTable' 依赖于 列 'DM1_ArchiveDocID'。
服务器: 消息 5074,级别 16,状态 1,行 1
对象 'FK_ArchiveDocAttribute_ArchiveDoc' 依赖于 列 'DM1_ArchiveDocID'。
服务器: 消息 4922,级别 16,状态 1,行 1
ALTER TABLE DROP COLUMN DM1_ArchiveDocID 失败,因为有一个或多个对象访问此列。
服务器: 消息 15335,级别 11,状态 1,过程 sp_rename,行 342
错误: @newname 值 'DM1_ArchiveDocID' 已用作 COLUMN 名称,该值将导致重复,而这是不允许的。

我也想想。
zjcxc 元老 2004-04-30
  • 打赏
  • 举报
回复
--看来都得写代码了

alter table ArchiveDoc add id_bak bigint NULL
go

update ArchiveDoc set id_bak=DM1_ArchiveDocID
go

--删除外键约束
declare tb cursor local for
select s='alter table ['+c.name+'] drop constraint ['+b.name+']'
from sysforeignkeys a
join sysobjects b on b.id=a.constid
join sysobjects c on c.id=a.fkeyid
join syscolumns d on d.id=c.id and a.fkey=d.colid
join sysobjects e on e.id=a.rkeyid
join syscolumns f on f.id=e.id and a.rkey=f.colid
where e.name='ArchiveDoc' and f.name='DM1_ArchiveDocID'

declare @s varchar(8000)
open tb
fetch next from tb into @s
while @@fetch_status=0
begin
exec(@s)
fetch next from tb into @s
end
close tb
deallocate tb
go

--删除主键约束
alter table ArchiveDoc drop constraint PK_ArchiveDocTable
go

alter table ArchiveDoc drop column DM1_ArchiveDocID
go

exec sp_rename 'ArchiveDoc.id_bak','DM1_ArchiveDocID','COLUMN'
go

zjcxc 元老 2004-04-29
  • 打赏
  • 举报
回复
--应该换顺序,先删除外键,再删除主键

alter table ArchiveDoc add id_bak bigint NULL
go

update ArchiveDoc set id_bak=DM1_ArchiveDocID
go


--删除外键约束
alter table ArchiveDocApprove drop constraint FK_ArchiveDocApprove_ArchiveDoc
alter table ArchiveDocAttribute drop constraint FK_ArchiveDocAttribute_ArchiveDoc1
alter table ArchiveDocAttribute drop constraint FK_ArchiveDocAttribute_ArchiveDoc
go

--删除主键约束
alter table ArchiveDoc drop constraint PK_ArchiveDocTable
go
alter table ArchiveDoc drop column DM1_ArchiveDocID
go

exec sp_rename 'ArchiveDoc.id_bak','DM1_ArchiveDocID','COLUMN'
go
liyin_first 2004-04-29
  • 打赏
  • 举报
回复
谢谢 zjcxc(邹建) 老兄,因为这个东西要得很急,所以,我也不想费时间想了。
我把ArchiveDoc 的脚本弄出来
CREATE TABLE [dbo].[ArchiveDoc] (
[DM1_ArchiveDocID] [bigint] IDENTITY (1, 1) NOT NULL ,
[DM1_ArchiveDocName] [varchar] (500) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[DM1_StatusID] [int] NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ArchiveDoc] WITH NOCHECK ADD
CONSTRAINT [PK_ArchiveDocTable] PRIMARY KEY CLUSTERED
(
[DM1_ArchiveDocID]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ArchiveDoc] ADD
CONSTRAINT [FK_ArchiveDoc_ArchiveDocStatus] FOREIGN KEY
(
[DM1_StatusID]
) REFERENCES [dbo].[ArchiveDocStatus] (
[DM3_StatusID]
)
GO

然后就是其他3张表与DM1_ArchiveDocID 的关系。
老兄给的脚本运行错误是:

服务器: 消息 3725,级别 16,状态 1,行 3
约束 'PK_ArchiveDocTable' 正由表 'ArchiveDocApprove' 的外键约束 'FK_ArchiveDocApprove_ArchiveDoc' 引用。
服务器: 消息 3727,级别 16,状态 1,行 3
未能除去约束。请参阅前面的错误信息。
服务器: 消息 3733,级别 16,状态 2,行 5
约束 'FK_ArchiveDocAttribute_ArchiveDoc' 不属于表 'ArchiveDocAttribute'。
服务器: 消息 3727,级别 16,状态 1,行 5
未能除去约束。请参阅前面的错误信息。
服务器: 消息 5074,级别 16,状态 8,行 2
对象 'PK_ArchiveDocTable' 依赖于 列 'DM1_ArchiveDocID'。
服务器: 消息 5074,级别 16,状态 1,行 2
对象 'FK_ArchiveDocAttribute_ArchiveDoc' 依赖于 列 'DM1_ArchiveDocID'。
服务器: 消息 4922,级别 16,状态 1,行 2
ALTER TABLE DROP COLUMN DM1_ArchiveDocID 失败,因为有一个或多个对象访问此列。
服务器: 消息 15335,级别 11,状态 1,过程 sp_rename,行 342
错误: @newname 值 'DM1_ArchiveDocID' 已用作 COLUMN 名称,该值将导致重复,而这是不允许的。

希望zjcxc(邹建)老兄帮忙,小弟十分感谢!!
zjcxc 元老 2004-04-29
  • 打赏
  • 举报
回复
--如果要用脚本,则要删除主键/外键约束

alter table ArchiveDoc add id_bak bigint NULL
go

update ArchiveDoc set id_bak=DM1_ArchiveDocID
go

--删除主键约束
alter table ArchiveDoc drop constraint PK_ArchiveDocTable
go

--删除外键约束
alter table ArchiveDocApprove drop constraint FK_ArchiveDocApprove_ArchiveDoc
alter table ArchiveDocAttribute drop constraint FK_ArchiveDocAttribute_ArchiveDoc1
alter table ArchiveDocAttribute drop constraint FK_ArchiveDocAttribute_ArchiveDoc
go

alter table ArchiveDoc drop column DM1_ArchiveDocID
go

exec sp_rename 'ArchiveDoc.id_bak','DM1_ArchiveDocID','COLUMN'
go
zjcxc 元老 2004-04-29
  • 打赏
  • 举报
回复
建议在企业管理器中修改,这样就可以解决这些约束的问题.

而且也安全

34,576

社区成员

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

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