0

我的表如下所示:

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值为 is 的位置accepted只有一行NULL

我考虑过使用一个单独的字段pending_review,它是1orNULL并将 UNIQUE 约束与entry_id.

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

4

1 回答 1

1

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

CHECK(NOT EXISTS(SELECT 1 FROM entry_title WHERE accepted IS NULL GROUP BY entry_id HAVING COUNT(*) > 1))

唉,我们生活在不完美的世界里。看到这个问题

因此,请改用具有相同逻辑的触发器。

[更新-触发]

就像是

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

并且在更新之前也做同样的事情。免责声明,我没有检查这个。

于 2012-06-13T10:07:17.547 回答