我的表格如下:
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_review
或1
的单独字段NULL
,并在其entry_id
上加上UNIQUE约束。
问题在于,当变更被接受或拒绝时,我会以某种方式取消设置该字段,并且该级别的一致性会要求另一种约束,这种约束会导致与上述更简单的解决方案相同的问题。
答案 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做同样的事情。 免责声明,我没有检查过这个。