2015-07-04 90 views
1

我正在使用SDL Server 2008 R2,其中我生成了一個僅模式數據庫腳本。生成的腳本如下:在生成的數據庫模式腳本中包含CHECK CONSTRAINT&GO的用途

ALTER TABLE [dbo].[ConsoleServer] WITH CHECK ADD CONSTRAINT [FK_ConsoleServer_RackUnits] FOREIGN KEY([RackUnitID]) 
REFERENCES [dbo].[RackUnits] ([UnitID]) 
GO 
ALTER TABLE [dbo].[ConsoleServer] CHECK CONSTRAINT [FK_ConsoleServer_RackUnits] 

我有這2個問題: -

  • 我知道,第一行是負責兩個數據庫表之間創建一個FK。但什麼是以下的目的:

    ALTER TABLE [dbo].[ConsoleServer] CHECK CONSTRAINT [FK_ConsoleServer_RackUnits]

  • 一般來說,爲什麼DB腳本有字GO。現在,如果我刪除它,腳本將在目標數據庫上執行得很好,那麼爲什麼它在任何語句之前包含在腳本中?

+0

您的第一個問題是答案[here](http://stackoverflow.com/a/530303/2091410)。至於'GO',它的回答很好[這裏](http://stackoverflow.com/a/20711373/2091410)。 GO聲明不適用於您的情況。這只是SSMS在發出SQL命令時要格外小心的一個例子,因爲它不知道* next *命令是什麼。 –

+0

@EdGibbs以及「ALTER TABLE [dbo]。[ConsoleServer] CHECK CONSTRAINT [FK_ConsoleServer_RackUnits]」?我是否需要它,因爲我在後面的表中創建一個約束檢查? –

+0

我不認爲你會這樣做。如果約束最初被定義爲「WITH NOCHECK」,那麼它會有意義,但事實並非如此。我想另一個案例是SSMS過於謹慎。 –

回答

3
  1. ALTER TABLE ... CHECK CONSTRAINT ...線使該約束。您可以添加一個約束並將其禁用(例如在清理數據時)。查看更多here

  2. GO是批處理分隔符,它只能被SSMS識別。一些陳述如CREATE PROCEDURE...要求它是該批次中的第一條陳述。您可以將其輸入到新文件中,或使用GO終止上一批。儘管如此,不要通過OLEDB或ADO.NET從應用程序發送GO

+0

所以在我的情況下,因爲我指定在alter statment中創建約束條件「with check」,,,我還需要第二條語句嗎? –

+2

@johnG不,你不 –

+0

那麼爲什麼sql server management studio指定這個時,我只爲表生成一個模式腳本?是否有一個原因 ? –