MySQL:实现 "conditional primary key" 的正确方法

MySQL: Proper way to implement a "conditional primary key"

这是我提交的内容table。用户提交挑战。他们可以根据需要提交任意数量的提交,直到有一个正确的提交为止。一旦记录了正确的提交,就不应再提交 challenge_iduser_id 组合。我最初是在我的应用程序中强制执行此约束,但想将此约束移至数据库。

+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_id      | int(11)      | YES  | MUL | NULL    |                |
| challenge_id | int(11)      | YES  | MUL | NULL    |                |
| correct      | tinyint(1)   | YES  |     | NULL    |                |
| timestamp    | datetime     | YES  |     | NULL    |                |
| flag         | varchar(512) | YES  |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+

我试过的

我试过将 table 的主键设为 KEY(user_id, challenge_id, correct)。这样做的问题是,只要正确为假,就可以多次提交。

解决这个问题的方法是什么?

如果您不需要记录不正确的提交,请不要​​记录。

如果您确实需要完整的历史记录,正如您观察到的那样,无法通过 UNIQUE 键完成。

A 计划:添加一个 TRIGGER 检查插入第二个正确答案。同时,PK还需要别的东西。

B 计划:table 次正确提交和 table 次错误(或可能全部)提交。两者都不一定需要 correct 列。也许其他一些列不必在两个 table 中。 PK会不一样。