【问题标题】:MySQL: Proper way to implement a "conditional primary key"MySQL:实现“条件主键”的正确方法
【发布时间】:2021-03-03 13:04:56
【问题描述】:

这是我的提交表。用户提交挑战。他们可以根据需要提交任意数量的提交,直到提交正确为止。一旦记录了正确的提交,就不应再有提交给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    |                |
+--------------+--------------+------+-----+---------+----------------+

我的尝试

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

解决此问题的一种方法是什么?

【问题讨论】:

    标签: mysql python-3.x database-design flask-sqlalchemy


    【解决方案1】:

    如果您不需要记录错误的提交,请不要​​。

    如您所见,如果您确实需要完整的历史记录,则无法通过 UNIQUE 键完成。

    计划 A:添加一个 TRIGGER 来检查是否插入了第二个正确答案。同时,还需要其他的 PK。

    B 计划:有一个正确提交的表格和一个不正确(或可能所有)提交的表格。两者都不一定需要correct 列。也许其他一些列不必在两个表中。 PK 会有所不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 2010-09-21
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多