两个可为空的列之一需要具有值

Bar*_*xto 12 mysql null database-design

无解释问题:

反正有 2 个空值的约束,总是需要 1 有 value 吗?例如,两个日期列都为空,但至少有1 个需要有值

问题描述:

假设我有一个名为 Expense 的表

并有 2 个日期:

prevision_expense_expiration_date DATE NULLABLE 费用_payment_date DATE NULLABLE

这两列的逻辑如下:

我买了一些东西,我知道我必须为它付款,某个日期,比如电话费。我会将此作为费用输入,并带有费用支付日期。这个日期是我应该付款的假定日期,而不是实际付款日期,例如发票的到期日期。

在其他情况下,我出售某些提供商的礼品卡以获取其服务。当客户兑换卡时,我可能需要向我的提供商购买服务转移给我的客户。因此,礼品卡有一个到期日期,我想为该“费用”做一个预想,而不是在礼品卡有效期内作为费用插入,如果礼品卡过期,则该“费用”不应进入帐户系统。

我知道我可以有 2 个相同的表,称为 prevision_expense 和confirmed_expense,但听起来不对,所以我在同一个表中,2 个日期,可以为空,但我想限制或其他东西,以便始终需要一个。

还有另一种可能的策略:

payment_date 日期非空 is_prevision_date BOOL 非空

因此,在这种情况下,如果日期是 prevision bool 值将为 1,否则将为 0。没有空值,一切都很好。除了我想要在第一次有一个预设日期时存储两个值的选项,然后(让我们说两天后)有该费用的确认日期,在这种情况下,使用策略 2 我将没有该选项。

我在数据库设计中做错了什么吗?:D

Mic*_*ngs 10

JD Schmidt 答案的一个版本,但没有额外列的尴尬:

CREATE TABLE foo (
  FieldA INT,
  FieldB INT
);

DELIMITER //
CREATE TRIGGER InsertFieldABNotNull BEFORE INSERT ON foo
FOR EACH ROW BEGIN
  IF (NEW.FieldA IS NULL AND NEW.FieldB IS NULL) THEN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = '\'FieldA\' and \'FieldB\' cannot both be null';
  END IF;
END//
CREATE TRIGGER UpdateFieldABNotNull BEFORE UPDATE ON foo
FOR EACH ROW BEGIN
  IF (NEW.FieldA IS NULL AND NEW.FieldB IS NULL) THEN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = '\'FieldA\' and \'FieldB\' cannot both be null';
  END IF;
END//
DELIMITER ;

INSERT INTO foo (FieldA, FieldB) VALUES (NULL, 10); -- OK
INSERT INTO foo (FieldA, FieldB) VALUES (10, NULL); -- OK
INSERT INTO foo (FieldA, FieldB) VALUES (NULL, NULL); -- gives error
UPDATE foo SET FieldA = NULL; -- gives error
Run Code Online (Sandbox Code Playgroud)