【问题标题】:How to set 2 bool columns to always only have 1 as true in MySQL?如何在 MySQL 中将 2 个布尔列设置为始终只有 1 个为真?
【发布时间】:2021-12-29 17:26:28
【问题描述】:

我有这张桌子:

CREATE TABLE transactions (
    transaction_id INT NOT NULL AUTO_INCREMENT,
    account_id INT NOT NULL,
    transaction_date DATETIME NOT NULL DEFAULT getdate(),
)ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

2 个快速问题, 首先,我将如何只允许 isOutgoing / isIngoing 为 TRUE,但不能同时为 TRUE?就像我可以触发但对逻辑感到困惑,因为我怎么知道哪个是正确的?或者我应该只是触发抛出错误?不确定解决此问题的最佳方法。

第二个问题,我可以进一步规范这个表吗?

【问题讨论】:

  • 只需将一个计算列设为非计算列的倒数即可。

标签: mysql sql database phpmyadmin normalization


【解决方案1】:

也许这就是你想要的:

alter table transactions add constraint in_out_check 
check (
  not(isOutgoing = true and isIngoing = true)
);

关于规范化,如果您的descriptions 是预定义的,那么为descriptions 创建一个查找表并将transaction 表上的description 列替换为查找的id 可能会很有用.

【讨论】:

  • 描述 arnt 是预定义的,它们是可选的,所以我应该保持我的桌子原样吗?这会是 3NF 桌子吗?还要感谢您回答我的第一个问题,这实际上会做什么?如果我尝试将两者都设置为 true,它会抛出错误,还是会发送消息?谢谢。
  • 违反约束总是返回错误。关于标准化,只有一张模型表,我不能告诉你更多。如果答案有效,请将其标记为正确。
  • 谢谢,在MySQL中抛出错误通常可以吗?还是这是不好的做法
  • 我也尝试了检查命令,但它似乎不起作用,好像mysql不支持它?
  • 你一定是做错了什么,它运作良好。你可以测试这个dbfiddle.uk/…
猜你喜欢
  • 2023-03-14
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
相关资源
最近更新 更多