2011-08-16 70 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;