【问题标题】:t-SQL - constraint on one column that has multiple conditionst-SQL - 对具有多个条件的一列的约束
【发布时间】:2017-05-08 09:08:58
【问题描述】:

我目前正在重构一个设计不佳的数据库,出于完整性目的,我想做的一件事是使某个记录唯一依赖于几个变量。

我使用的表格是报价,有问题的列是报价编号,我需要的是每个公司和集团都是唯一的,所以例如Quote001应该是唯一的,除非有新公司/ 组使用。

因此您可以将Quote001company1group1 一起使用,但是如果使用company1group1 进行新报价,则新报价编号应为Quote002。但是,如果 Company2group1 引用它应该返回到 Quote001

我不确定如何使用数据库中的约束最有效地实现这一目标。

谢谢, 大卫

【问题讨论】:

  • 发布一些具有预期结果的示例数据
  • 这根本不是一个答案,但是在所有公司和集团中拥有完全唯一的报价编号有什么问题?这意味着即使您只有一个报价单号,您也可以在不需要其他信息的情况下提取记录。
  • 同意@Matthew,只需增加int 值,如果您确实需要在生成的任何文档的开头添加Quote00x
  • @Madhivanan 我会一起举一些例子
  • @Matthew - 我希望将其分段的原因是因为所讨论的系统是一个 CRM 系统,在各个国家/地区使用(由组确定)每个国家/地区都有单独的访问权限和权限每个只在系统中看到特定公司的客户经理,他们只会看到自己的报价。因此,为什么我希望每个人都有自己的一组报价。

标签: sql sql-server tsql constraints


【解决方案1】:

如果您在此表上已经有一个标识列,我将使用它为 qoute 编号创建一个计算列。如果您还没有,您可以添加它。

为此,首先您需要定义一个 UDF 来为您进行计算:

CREATE FUNCTION dbo.CalculateQuoteNumber(@id int, @Company int, @Group int)
RETURNS int
AS
BEGIN
    RETURN 
    (
        SELECT COUNT(*) 
        FROM YourTable
        WHERE Company = @Company
        AND [Group] = @Group
        AND id <= @id            
    )
END
GO

然后,您将报价编号添加为计算列:

ALTER TABLE YourTable
   ADD QuoteNumber as dbo.CalculateQuoteNumber(id, Company, [Group])   

现在 sql server 会为你做计算,你是安全的,因为计算的列不能被用户插入或更新。

You can see a live demo on rextester.

【讨论】:

    【解决方案2】:

    你需要一个唯一的约束。

                ALTER TABLE Quotes
                ADD CONSTRAINT ucQuote UNIQUE (QuoteNumber, Company, Group)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多