2011-08-16 108 views
1

我根本不瞭解SQL,但是我有一個表,它有一個唯一的鍵約束,我可以在SSMS中通過展開我的表下的Keys文件夾來看到它。它使一列,'名稱',獨特。我需要一些關於SQL和約束的幫助

目前它是完全獨一無二的,但我需要改變它,所以名稱對於另一列'catflapID'中的特定ID是唯一的。所以名稱可以在表中複製,但是對於每個catflapID都可以不存在重複。

我完全不知道如何做到這一點,我需要以某種方式結束腳本,刪除現有的約束,並添加我的新約束。

有什麼建議嗎?

+0

的SQL服務器'ALTER TABLE':http://msdn.microsoft.com/en-us/ library/ms190273.aspx –

+1

而http://msdn.microsoft.com/en-us/library/ms187335%28v=sql.90%29.aspx如果你想找出CONSTRAINT的名字,那麼你可以把它放在你的腳本。 –

+0

類似於'ALTER TABLE TableName DROP CONSTRAINT ConstraintName;' –

回答

1
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[test_table]') AND name = N'IX_test_table') 
ALTER TABLE [dbo].[test_table] DROP CONSTRAINT [IX_test_table] 
GO 

ALTER TABLE [dbo].[test_table] ADD CONSTRAINT [IX_test_table] UNIQUE NONCLUSTERED 
(
    [c_name] ASC, 
    [c_id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 
+0

這看起來很不錯,謝謝,當前的鍵名爲UQ__CatFlap__86007E41267D1C7F,它看起來是隨機生成的,我不確定如果在其他服務器上鍵名不同時如何編寫通用腳本來刪除它,您怎麼看? – NibblyPig

+1

例如,你可以通過這種方式獲得關鍵的名稱: '從系統對象 選擇名稱,其中parent_obj =(從sysobjects中選擇id其中名稱=「TEST_TABLE」)AND的xtype =「UQ'' – Max

+1

使用來自Max的評論腳本以上並將名稱存儲在變量中。將該變量注入一個字符串,該字符串的值是Max對問題的回答,但將該變量替換爲對象名稱。然後,使用sp_executesql(http://msdn.microsoft.com/zh-cn/library/ms175170.aspx)執行該字符串。這被稱爲「動態SQL」,並且是真正實現您想要的唯一通用方法。這就是爲什麼你總是要命名對象的原因,特別是當你有多個生產服務器時。 –

0

您應該爲這兩列創建複雜的唯一約束。

刪除現有的約束和執行該代碼(變「MyTable的」名稱實際表名)

ALTER TABLE MyTable ADD CONSTRAINT MyConstraint2 UNIQUE (catflapID, name) 
0

您需要創建關係表的外鍵。例如,

CREATE TABLE table1 (catflapID INT NOT NULL PRIMARY KEY , ...) 
CREATE TABLE table2 (ID INT PRIMARY KEY , catflapID INT NOT NULL FOREIGN KEY REFERENCES Table1(catflapID)) 

表1中的catflapID不是NULL和PRIMARY KEY,所以此字段將是唯一的。 表2中的catflapID是從Table2引用的,因此它只能包含來自Table1的值。

0

要創建新的約束

ALTER TABLE tab 
    ADD CONSTRAINT UniqueNameForCat UNIQUE (catflapID, name); 

刪除舊的,過時的約束

ALTER TABLE tab DROP CONSTRAINT oldConstraintName;