我有一个表,其中一列是BIGINT,我想在某个值范围上添加一个约束。例如,我想允许0到2M,但阻止2M+1到3M,允许3M+1等。数据库是MariaDB。希望防止两个数据库在共享资源池中的值重叠。
7lrncoxx1#
您可以使用check约束来实现这一点。比如说,
check
create table test(id bigint, constraint blah check ( id < 2000000 OR (id >3000000 AND id <4000000) OR (id >5000000 AND id <6000000) ))
你可以看到它在this Fiddle中工作。(这只是一个例子,因为你想要的模式对我来说并不完全清楚。正如danblack在评论中指出的那样,你可以使用between和/或mod更有效地编写它。(如果有一个可预测的模式来描述所允许的内容,mod将非常有用。)
between
mod
create table test(id bigint, constraint blah check ( id < 2000000 OR (id BETWEEN 3000001 AND 4000000) OR (id BETWEEN 5000001 AND 6000000) ))
正如Akina在评论中指出的那样,check约束需要MySQL v.8.0.16 v.10.2.1(或更高版本)。这个问题意味着你要把它添加到一个现有的bigint列中,但是正如Bill Karwin在评论中指出的那样,你可以使用bigint unsigned作为类型,以避免在check约束中排除/处理负数。
bigint
bigint unsigned
1条答案
按热度按时间7lrncoxx1#
您可以使用
check
约束来实现这一点。比如说,你可以看到它在this Fiddle中工作。(这只是一个例子,因为你想要的模式对我来说并不完全清楚。
正如danblack在评论中指出的那样,你可以使用
between
和/或mod
更有效地编写它。(如果有一个可预测的模式来描述所允许的内容,mod
将非常有用。)正如Akina在评论中指出的那样,
check
约束需要MySQL v.8.0.16 v.10.2.1(或更高版本)。这个问题意味着你要把它添加到一个现有的
bigint
列中,但是正如Bill Karwin在评论中指出的那样,你可以使用bigint unsigned
作为类型,以避免在check
约束中排除/处理负数。