如何在MySQL中为此条件添加约束?

时间:2012-06-13 09:57:10

标签: mysql sql database-design foreign-keys constraints

我的表格如下:

CREATE TABLE IF NOT EXISTS `entry_title` (
  `entry_title_id` int(11) NOT NULL AUTO_INCREMENT,
  `entry_id` int(11) NOT NULL,
  `accepted` tinyint(1) DEFAULT NULL,
  `entry_title_lang` char(2) CHARACTER SET ascii NOT NULL,
  `entry_title_value` varchar(255) NOT NULL,
  `entry_title_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`entry_title_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

表格中的一行代表网站上内容的标题。

这个想法是任何人都可以提交一个新的(希望改进的)标题。

然后社区接受或放弃更改。

如果接受的标志等于NULL,则表示该更改正在等待社区审核。 0被解释为丢弃,1被接受。

网站会显示最近timestamp的标题,其中接受的标记等于1

如果有待更改待审核,则在待处理或被拒绝之前,我无法提交任何其他更改。

因此,我希望在我的数据库中设置一个约束,以确保每个entry_id只有accepted的值为NULL的行。

我考虑过使用pending_review1的单独字段NULL,并在其entry_id上加上UNIQUE约束。

问题在于,当变更被接受或拒绝时,我会以某种方式取消设置该字段,并且该级别的一致性会要求另一种约束,这种约束会导致与上述更简单的解决方案相同的问题。

1 个答案:

答案 0 :(得分:1)

[更新] 在标准驱动的理想世界中:

CHECK(NOT EXISTS(SELECT 1 FROM entry_title WHERE accepted IS NULL GROUP BY entry_id HAVING COUNT(*) > 1))
唉,我们生活在不完美的世界。见question

因此,请使用相同逻辑的触发器。

[更新 - 触发]

这样的东西
CREATE TRIGGER triggerName BEFORE INSERT ON entry_title FOR EACH ROW
BEGIN
    IF EXISTS(SELECT 1 FROM entry_title 
              WHERE accepted IS NULL AND entry_id = NEW.entry_id 
              GROUP BY entry_id 
              HAVING COUNT(*) > 1) THEN
        SIGNAL SQLSTATE '45000'
    END IF;
END

也为BEFORE UPDATE做同样的事情。 免责声明,我没有检查过这个。