当前位置: 网学 > 编程文档 > SQL SERVER > 正文

SQL Server中为现有的列添加或去掉标识属性

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/19
下载{$ArticleTitle}原创论文样式
问题

  SQL Server有一个不错的常用特性,就是标识列。利用这个特性,你可以轻松地在表里为每一行创建唯一的值。添加一个新的列并设置为标识列,或者删除现有标识列都很简单,但是如果是要把一个现有的列改为标识列,或者去掉现有的标识列的标识属性,那应该怎么做呢?

  专家解答:

  要做到这一步并不容易,或者说没有什么简单易行的方法。SQL Server的设计里并没有很简单的就现有的列加上或去掉标识属性的方法。最安全的办法是,创建一个新的列并设置为标识列,或者创建一个新的表,然后把数据移植进去。

  我们来看看一些例子:

  例一

  现有一个简单的表,表里含有两列,其中一列为标识列。

CREATE TABLE [dbo].[Test1](
   [id] [int] IDENTITY(1,1) NOT NULL,
   [name] [nchar](10) NULL
)

  如果我们用SQL Server Management Studio来去掉”id”列的标识值,这样就会创建出一个新的临时表,原表的数据都移到了临时表中,然后删除原表并为新表重命名。我们可以从下面的脚本里看到这个过程。

  要看到这个脚本,只要使用 Management Studio来进行改动,然后右击designer,选择"Generate Change Script"。

以下是引用片段:
/* 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
DROP TABLE dbo.Test1
GO
EXECUTE sp_rename N''dbo.Tmp_Test1'', N''Test1'', ''OBJECT'' 
GO
COMMIT

  例二

  我们现在来把它弄得更复杂一点,在表里设置主键,然后创建以外键约束的另一个表,以第一个表主键为索引。我们可以看到这样做需要花更多工夫。

以下是引用片段:
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”
  •   临时表“

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号