MySQL:实现 "conditional primary key" 的正确方法
MySQL: Proper way to implement a "conditional primary key"
这是我提交的内容table。用户提交挑战。他们可以根据需要提交任意数量的提交,直到有一个正确的提交为止。一旦记录了正确的提交,就不应再提交 challenge_id
、user_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会不一样。
这是我提交的内容table。用户提交挑战。他们可以根据需要提交任意数量的提交,直到有一个正确的提交为止。一旦记录了正确的提交,就不应再提交 challenge_id
、user_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会不一样。