【问题标题】:How to create mutually exclusive table columns如何创建互斥表列
【发布时间】:2012-12-09 18:58:09
【问题描述】:

我有一个表 Transactions,其中我为一笔交易保存两条记录,一条用于借记和其他贷记。

所以我在表creditAmount(Money)debitAmount(Money) 中有两列。

我想要一个表级约束,即每行中的任一列都不为空。 即,如果第 3 行 creditAmount 为空,则 debitAmount 必须保持一些值,反之亦然。

连续插入记录时如何保证相同?

【问题讨论】:

  • 为什么不用一列和一个标志来指示CD
  • 只是好奇,但为什么单个值的符号不足以指示贷方或借方?
  • 这是要求,我改不了。

标签: sql-server tsql sql-server-2012 mutual-exclusion


【解决方案1】:

如果您通过前端(您的应用程序)进行处理,则不会出现 Credit 和 Debit 都为空的问题。至少插入一个条目,在借方或贷方中。

我猜你想在有人通过后端处理并直接在表中插入值时设置一个约束。在这种情况下,克里斯提出了一个解决方案。

但是,即使您是从后端插入,我也不会理解为什么我会在既不是借方也不是贷方的情况下记录交易。

【讨论】:

  • 实际上它是一项服务,作为服务开发人员,我不能完全依赖发送给我的数据。所以,这只是为了预防。
  • 在各个级别验证您的数据非常有用。参考文献有人手动将数据输入数据库并绕过任何前端或实际上是业务层验证逻辑的情况。
【解决方案2】:

您可以在表格中添加CHECK constraint

ALTER TABLE Transactions ADD CONSTRAINT CK_Transactions_DebitOrCreditExists
CHECK ((creditAmount IS NULL AND debitAmount IS NOT NULL) 
   OR (creditAmount IS NOT NULL AND debitAmount IS NULL))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2021-06-30
    • 1970-01-01
    相关资源
    最近更新 更多