这是我的表:创建唯一约束最初禁用
CREATE TABLE [dbo].[TestTable]
(
[Name1] varchar(50) COLLATE French_CI_AS NOT NULL,
[Name2] varchar(255) COLLATE French_CI_AS NULL,
CONSTRAINT [TestTable_uniqueName1] UNIQUE ([Name1]),
CONSTRAINT [TestTable_uniqueName1Name2] UNIQUE ([Name1], [Name2])
)
ALTER TABLE [dbo].[TestTable]
ADD CONSTRAINT [TestTable_uniqueName1]
UNIQUE NONCLUSTERED ([Name1])
ALTER TABLE [dbo].[TestTable]
ADD CONSTRAINT [TestTable_uniqueName1Name2]
UNIQUE NONCLUSTERED ([Name1], [Name2])
GO
ALTER INDEX [TestTable_uniqueName1]
ON [dbo].[TestTable]
DISABLE
GO
我的想法是使/取决于客户应用禁用一个或其他唯一contraint。通过这种方式,我可以捕捉到我的c#代码中抛出的异常,并向GUI显示特定的错误消息。现在
,我的问题是改变列Name1
& Name2
的整理,我需要让他们区分大小写(French_CS_AS
)。要改变这些字段,我必须删除这两个约束并重新创建它。根据解释的模式,我不能创建一个启用的约束,然后禁用它,因为有些客户,我有一个或其他约束的重复键。
对于我的更新脚本,我的想法号码1是
- 保存在临时表
- 降启用的约束的约束
- 阿尔特列
- 创建禁用唯一约束名称
- 根据保存的值以点1启用特定约束。
我的问题是在第4点,我找不到如何使用ALTER TABLE
语句创建禁用的唯一约束。是否有可能直接在sys.indexes
表中创建它?
我的想法号2是
- 重命名TestTable的到TestTableCopy
- 重新创建TestTable的新栏整理,否则相同的架构(索引,FK,触发器,...)
- 禁用在TestTable的特异性目的唯一约束上
- 从TestTableCopy数据迁移到TestTable的
- 降TestTableCopy
以这种方式,我担心的是松散与其他表/相关性的链接,因为它是我数据库中的中心表。
有没有其他办法可以实现我的目标?
如有必要,我可以使用唯一索引而不是唯一约束。
为什么不能忘记Unique约束并检查自己并在向表中添加记录时捕获异常? – CiucaS
因为可以从多种方式插入记录(使用t-sql,从我的c#应用程序中...)。我希望数据库检查我的数据。 – stephanejulien
创建存储过程以将记录插入到表中,可以将它用于所有需要的插入类型。在存储过程中,根据需要检查约束。那将是我会这样做的方式。改变表格不是一个好习惯。 – CiucaS