在一个有50列的MariaDB 10.1表中,我有两列"code"它是一个由13个随机字符和"maxversion"这是一个tinyint布尔值(0或1)。
是否有可能添加一个唯一键或约束,说每个代码,只有一行可以有一个maxversion = 1?请记住,应该仍然允许有许多行具有相同的代码和maxversion = 0。
例子:
允许:
code | maxversion
123456789abcd | 1
123456789abcd | 0
123456789abcd | 0
123456789abcd | 0
dcba987654321 | 1
dcba987654321 | 0
dcba987654321 | 0
这是不允许的:
code | maxversion
123456789abcd | 1
123456789abcd | 1
123456789abcd | 0
123456789abcd | 0
dcba987654321 | 1
dcba987654321 | 0
dcba987654321 | 0
我想这可以通过触发器实现,但是有没有一种更干净、更简洁的方式来实现呢?
当您将服务器版本更新到10.2+(或任何维护版本)时,您可以使用具有唯一键的生成列来实现您的结果:
alter table c
add c_maxversion varchar(13) as (if(maxversion, code, NULL)) unique
因为NULL
不是一个值,所以它没有唯一约束,但是唯一值出现在maxversion
= 1的代码中。
裁判:https://dbfiddle.uk/XKEGsIjy
如果你从头开始做这个问题,按照Georg的建议,在maxversion
列中使用NULL
而不是0
,然后你只需要code, maxversion
作为唯一索引,而不需要生成列。