如何把数据库中所有表的主键更改为int identifier?

luxi0194 2010-06-25 05:24:49
如何把数据库中所有表的主键更改为int identifier?

注意数据库表有很多,每个表都是唯一主键,字段为ID,原来是int not null,想改为int identifier(1,1)

我知道可以一个表一个表的更改,有没有sql可以更改整个数据库的表?
...全文
90 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxmcxm 2010-06-25
  • 打赏
  • 举报
回复
无数据,直接在企业管理器中改吧,几百个表也就几个钟头.
要用t-sql,太复杂.
-深白色- 2010-06-25
  • 打赏
  • 举报
回复
楼主,一下是你要的sql,测试通过,


CREATE TABLE #TableNameList
(name varchar(100))
INSERT INTO #TableNameList
SELECT o.name FROM sys.objects AS o JOIN sys.columns AS c ON o.object_id=c.object_id WHERE o.[type]='U' AND c.name='id'
WHILE (SELECT COUNT(*) FROM #TableNameList)>0
BEGIN
DECLARE @tableName varchar(100)
SELECT TOP 1 @tableName=name FROM #TableNameList
DECLARE @dropColumnSql nvarchar(100)
DECLARE @addNewColumnSql nvarchar(100)
SET @dropColumnSql = 'ALTER TABLE ' + @tableName + ' DROP COLUMN id'
SET @addNewColumnSql='ALTER TABLE ' + @tableName + ' ADD id INT IDENTITY(1,1)'
exec sp_executesql @dropColumnSql
exec sp_executesql @addNewColumnSql
DELETE FROM #TableNameList WHERE name=@tableName
END
DROP TABLE #TableNameList
lds1ove 2010-06-25
  • 打赏
  • 举报
回复
已经存在的表没法用sql改
用企业管理器该一下吧
zjb211434 2010-06-25
  • 打赏
  • 举报
回复
可以新建一个表,id 为 identity之外,其他的字段跟你原表一样,然后把原表的数据insert到新建的表中(除了id列),再把原表删除,再把新建的表改名为原表名
htl258_Tony 2010-06-25
  • 打赏
  • 举报
回复
DECLARE @s VARCHAR(1000)
DECLARE c CURSOR FOR
SELECT 'ALTER TABLE ['+a.name+'] DROP COLUMN ID;ALTER TABLE ['+a.name+'] ADD ID INT IDENTITY PRIMARY KEY;'
FROM sysobjects a
JOIN syscolumns b
ON a.id=b.id
WHERE b.name='id'
AND a.type='U'
OPEN c
FETCH c INTO @s
WHILE @@FETCH_STATUS=0
BEGIN
EXEC (@s)
FETCH c INTO @s
END
CLOSE c
DEALLOCATE c
永生天地 2010-06-25
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
set @sql='
declare @sql varchar(8000)
set @sql=''alter table ? drop column id ; alter table ? add id int identity(1,1) primary key''
exec(@sql)
'
exec sp_msforeachtable @sql

没数据,试试
luxi0194 2010-06-25
  • 打赏
  • 举报
回复
SQL Server 2005是否可以更改系统表,我写了一个SQL,不过不能执行
update a set a.is_identity=1
from sys.columns a,sys.objects b
where a.name='ID'
and a.object_id=b.object_id
and b.type='U'
设置了EXEC sp_configure 'allow updates', 1
RECONFIGURE WITH OVERRIDE;也不行,SQL 2000中可以
luxi0194 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xys_777 的回复:]

SQL code
已表 tableA(id int not null,name varhcar(10))为例


BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_tableA
(
id int NOT NULL IDENTITY (1, 1),
name varchar(10)
) ON [PRIMARY]
GO
SET I……
[/Quote]

LS的只能更改一个表。。。
我希望可以更改所有的表,因为表太多了。。。。
每个表的主键命名都是ID
永生天地 2010-06-25
  • 打赏
  • 举报
回复
要全改,循环,并且动态执行
luxi0194 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 htl258 的回复:]

已存在的表有没有数据
[/Quote]
没有数据。。。
htl258_Tony 2010-06-25
  • 打赏
  • 举报
回复
已存在的表有没有数据
永生天地 2010-06-25
  • 打赏
  • 举报
回复
已表 tableA(id int not null,name varhcar(10))为例


BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_tableA
(
id int NOT NULL IDENTITY (1, 1),
name varchar(10)
) ON [PRIMARY]
GO
SET IDENTITY_INSERT dbo.Tmp_tableA ON
GO
IF EXISTS(SELECT * FROM dbo.tableA)
EXEC('INSERT INTO dbo.Tmp_tableA (id,name)
SELECT id,name FROM dbo.tableA WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_tableA OFF
GO
DROP TABLE dbo.tableA
GO
EXECUTE sp_rename N'dbo.Tmp_tableA', N'tableA', 'OBJECT'
GO
ALTER TABLE dbo.tableA ADD CONSTRAINT
PK_tableA PRIMARY KEY CLUSTERED
(
id
) ON [PRIMARY]

GO
COMMIT
thinclient 2010-06-25
  • 打赏
  • 举报
回复
等高手

34,590

社区成员

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

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