SQL Server中为现有的列添加或去掉标识属性
2008-01-09 09:52:24 来源:WEB开发网例二
我们现在来把它弄得更复杂一点,在表里设置主键,然后创建以外键约束的另一个表,以第一个表主键为索引。我们可以看到这样做需要花更多工夫。
以下是引用片段:
CREATE TABLE [dbo].[Test1](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nchar](10) NULL,
CONSTRAINT [PK_Test1] PRIMARY KEY CLUSTERED
(
[id] ASC
))
GO
CREATE TABLE [dbo].[Test2](
[id] [int] NULL,
[name2] [nchar](10) NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Test2] WITH CHECK ADD CONSTRAINT [FK_Test2_Test1] FOREIGN KEY([id])
REFERENCES [dbo].[Test1] ([id])
GO
ALTER TABLE [dbo].[Test2] CHECK CONSTRAINT [FK_Test2_Test1]
GO
如果我们按照上述的方法,然后使用Management Studio去掉表“test 1”中“id”列的标识值,可以从脚本里看到,这样需要更多的步骤才能达到我们的目的。
首先创建一个列属性正确的临时表“Tmp_Test1”
把数据从表“Test1”移植到临时表“Tmp_Test1”中
去掉Test2的外键约束
删除表“Test1”
临时表“Tmp_Test1”重命名为“Test1”
在表“Test1”里创建主键
最后重新在表“Test2”里创建外键约束。步骤太多了!
以下是引用片段:
/* To prevent any potential data loss issues, you should review this
script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_Test1
(
id INT NOT NULL,
name NCHAR(10) NULL
) ON [PRIMARY]
GO
IF EXISTS(SELECT * FROM dbo.Test1)
EXEC('INSERT INTO dbo.Tmp_Test1 (id, name)
SELECT id, name FROM dbo.Test1 WITH (HOLDLOCK TABLOCKX)')
GO
ALTER TABLE dbo.Test2
DROP CONSTRAINT FK_Test2_Test1
GO
DROP TABLE dbo.Test1
GO
EXECUTE sp_rename N'dbo.Tmp_Test1', N'Test1', 'OBJECT'
GO
ALTER TABLE dbo.Test1 ADD CONSTRAINT
PK_Test1 PRIMARY KEY CLUSTERED
(
id
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Test2 ADD CONSTRAINT
FK_Test2_Test1 FOREIGN KEY
(
id
) REFERENCES dbo.Test1
(
id
) ON UPDATE NO ACTION
ON DELETE NO ACTION
GO
COMMIT
同样,如果我们想要对现有的列进行修改,把其中一列变成标识列的话,需要花费同样的工夫。
另外一种可行的方法就是增加一列并设置为标识列,或者增加一列然后把旧列的数据移植到新列里。然后你可以删除之前的列,使用sp_rename存储过程来对进行新增列重命名。如果这些列里含有索引、外键或其他约束,你需要把它们都去掉才能作上述的修改。所以,这个方法也快不了多少。
我们现在知道,要修改现有列的标识属性没有什么捷径可走。你也可以在网络上搜索到其他的办法,可以修改系统表里的值。这些方法确实可以行得通,不过要注意的是,一旦出了什么差错,你可能会把数据全毁掉。
对于比较小的数据库系统而言,这里介绍的方法没有什么太大问题。不过对于忙碌的大数据库系统来说,去掉表里的约束、修改表里的标识属性就会是一件让人头疼的事情了。现在只能是期待SQL 2008里会不会出现什么让人眼前一亮的新特性了。
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接