91网首页-91网页版-91网在线观看-91网站免费观看-91网站永久视频-91网站在线播放

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

SQL Server中為現(xiàn)有的列添加或去掉標(biāo)識(shí)屬性

admin
2012年2月11日 0:26 本文熱度 3270

  問題:

  SQL Server有一個(gè)不錯(cuò)的常用特性,就是標(biāo)識(shí)列。利用這個(gè)特性,你可以輕松地在表里為每一行創(chuàng)建唯一的值。添加一個(gè)新的列并設(shè)置為標(biāo)識(shí)列,或者刪除現(xiàn)有標(biāo)識(shí)列都很簡單,但是如果是要把一個(gè)現(xiàn)有的列改為標(biāo)識(shí)列,或者去掉現(xiàn)有的標(biāo)識(shí)列的標(biāo)識(shí)屬性,那應(yīng)該怎么做呢?


  專家解答:


  要做到這一步并不容易,或者說沒有什么簡單易行的方法。SQL Server的設(shè)計(jì)里并沒有很簡單的就現(xiàn)有的列加上或去掉標(biāo)識(shí)屬性的方法。最安全的辦法是,創(chuàng)建一個(gè)新的列并設(shè)置為標(biāo)識(shí)列,或者創(chuàng)建一個(gè)新的表,然后把數(shù)據(jù)移植進(jìn)去。


  我們來看看一些例子:


  例一


  現(xiàn)有一個(gè)簡單的表,表里含有兩列,其中一列為標(biāo)識(shí)列。


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


  如果我們用SQL Server Management Studio來去掉”id”列的標(biāo)識(shí)值,這樣就會(huì)創(chuàng)建出一個(gè)新的臨時(shí)表,原表的數(shù)據(jù)都移到了臨時(shí)表中,然后刪除原表并為新表重命名。我們可以從下面的腳本里看到這個(gè)過程。


  要看到這個(gè)腳本,只要使用 Management Studio來進(jìn)行改動(dòng),然后右擊designer,選擇"Generate Change Script"。


SQL Server中為現(xiàn)有的列添加或去掉標(biāo)識(shí)屬性


以下是引用片段:
/* 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



  例二


  我們現(xiàn)在來把它弄得更復(fù)雜一點(diǎn),在表里設(shè)置主鍵,然后創(chuàng)建以外鍵約束的另一個(gè)表,以第一個(gè)表主鍵為索引。我們可以看到這樣做需要花更多工夫。


以下是引用片段:
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”列的標(biāo)識(shí)值,可以從腳本里看到,這樣需要更多的步驟才能達(dá)到我們的目的。


  首先創(chuàng)建一個(gè)列屬性正確的臨時(shí)表“Tmp_Test1”


  把數(shù)據(jù)從表“Test1”移植到臨時(shí)表“Tmp_Test1”中


  去掉Test2的外鍵約束


  刪除表“Test1”


  臨時(shí)表“Tmp_Test1”重命名為“Test1”


  在表“Test1”里創(chuàng)建主鍵


  最后重新在表“Test2”里創(chuàng)建外鍵約束。步驟太多了!


以下是引用片段:
/* 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


  同樣,如果我們想要對(duì)現(xiàn)有的列進(jìn)行修改,把其中一列變成標(biāo)識(shí)列的話,需要花費(fèi)同樣的工夫。



  另外一種可行的方法就是增加一列并設(shè)置為標(biāo)識(shí)列,或者增加一列然后把舊列的數(shù)據(jù)移植到新列里。然后你可以刪除之前的列,使用sp_rename存儲(chǔ)過程來對(duì)進(jìn)行新增列重命名。如果這些列里含有索引、外鍵或其他約束,你需要把它們都去掉才能作上述的修改。所以,這個(gè)方法也快不了多少。


  我們現(xiàn)在知道,要修改現(xiàn)有列的標(biāo)識(shí)屬性沒有什么捷徑可走。你也可以在網(wǎng)絡(luò)上搜索到其他的辦法,可以修改系統(tǒng)表里的值。這些方法確實(shí)可以行得通,不過要注意的是,一旦出了什么差錯(cuò),你可能會(huì)把數(shù)據(jù)全毀掉。


  對(duì)于比較小的數(shù)據(jù)庫系統(tǒng)而言,這里介紹的方法沒有什么太大問題。不過對(duì)于忙碌的大數(shù)據(jù)庫系統(tǒng)來說,去掉表里的約束、修改表里的標(biāo)識(shí)屬性就會(huì)是一件讓人頭疼的事情了。現(xiàn)在只能是期待SQL 2008里會(huì)不會(huì)出現(xiàn)什么讓人眼前一亮的新特性了。


該文章在 2012/2/11 0:26:30 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产日韩免费视 | 国产精品一区91 | 國產精品va| 91久色视 | 福利视屏网站 | 日本深夜刺激视频 | 欧美日韩另类在线 | 九一色色| 国产高清第一页 | 日韩国产欧美经典 | 91短视频在线观看 | 国产免费mv大全视 | 日本护士 | 91福利社区试看 | 国产欧美va天| 国产欧美精品久 | 国产愉拍精品视频手 | 国产精品亚洲片 | 日本高清www片 | 成人午夜在线视频网 | 国产在线欧 | 欧美淫秽一区二区 | 国产日韩欧美另类 | www.日本色| 91极品蜜桃 | 日韩经典第一页 | 韩日午夜福利 | 日韩视频免 | 99超级在线视频 | 成人午夜福利片 | 国产福利不卡视频 | 九九热国产视频精品 | 國產精品資源 | 欧美日韩一级视频 | 成人一级电影视频 | 国产呦福利导航 | 日本在线视频在线 | 中文字幕亚洲无线码 | 国产免费毛卡片 | 91国福利 | 国产丝袜大片 |