2011-02-01 88 views
15

私はSQLでスクリプトを書くのが初めてで、スクリプトの1つでエラーが発生しました。 問題のセクションでは、次のとおりです。ALTER TABLE文がFOREIGN KEY制約と競合しました

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE dbo.WorkspaceSettings 
(
    Id INT NOT NULL IDENTITY PRIMARY KEY , 
     ReportColorRGB1 VARCHAR(15) NOT NULL DEFAULT '61,105,138' , 
    ReportColorRGB2 VARCHAR(15) NOT NULL DEFAULT '180,210,121' 
) 

GO 

ALTER TABLE Workspace ADD WorkspaceSettingsId int NOT NULL default 1; 

GO 
ALTER TABLE Workspace 
ADD CONSTRAINT FK_WorkspaceSettings_Workspace 
FOREIGN KEY (WorkspaceSettingsId) 
REFERENCES WorkspaceSettings(Id); 
GO 

、次のエラーメッセージが表示されます。

メッセージ547、レベル16、状態0、行1
FOREIGN KEY制約」と競合ALTER TABLEステートメントFK_WorkspaceSettings_Workspace "を選択します。競合はデータベース "ClearRisk2_0"、テーブル "dbo.WorkspaceSettings"、列 'Id'で発生しました。

誰かが間違っていると教えてもらえますか?

答えて

34

Workspace.WorkspaceSettingsIdカラムに指定したデフォルト値1は、WorkspaceSettingsテーブルにはまだ存在しないため、FK違反です。

+0

おやっを!あなたは私の時間を節約する! ありがとうございます! – kevin

-1

ただのALTER TABLE sattement後に次のフレーズを追加します。

with nocheck 

だから、それは次のようになります。

Use Database_name 

Go 
    ALTER TABLE ResultScan with nocheck 
     ADD CONSTRAINT FK_ResultScan_ListVM FOREIGN KEY (TypeAnVirus)  
     REFERENCES ListVM (Id)  
     ON DELETE CASCADE  
     ON UPDATE CASCADE  
    ;  
    GO 
+0

ここでは「チェックしない」ことを説明することが重要です。おそらくこれは問題に対処しないだろう - - それを隠し、後に大きな問題を引き起こす。 – axlj

関連する問題