我有这样(实施例)的表:确保对表原子更新与特定的逻辑约束
id INT PRIMARY KEY
number BIGINT UNIQUE
type ENUM
user_id INT
number
是该表的主要数据,表示其中只有一个可以存在一个唯一的编号。这些数字可以是type
A或B.用户可以声明这些数字,在这种情况下,user_id
将被填入(直到此时为NULL
)。
在这个具体的逻辑约束是,许多只能使用一次权利和用户只能权利要求一个数A型的,但类型B的无限数量
为了确保用户可以只要求A类型的一个数字,那么UNIQUE (type, user_id)
约束就可以。这将阻止用户声称无限数量的B号码。
目前,我在应用层这样处理的:
SELECT COUNT(*) FROM `table` WHERE `type` = 'A' AND `user_id` = ?
如果计数不为0,中止,否则:
UPDATE `table` SET `user_id` = ? WHERE `type` = 'A' AND `user_id` IS NULL LIMIT 1
但还是有一个微小的机会在这种情况下,用户会得到两个A型号码。
如何制定约束或原子更新,以确保用户只能声明一个A型号码?在这里存储过程,触发器和类似的帮助吗?在没有重构架构的情况下,这可能在MySQL中吗?
何时知道1327号是A型还是B型? –
@Catcall它们是这样生成的。例如。 'INSERT INTO table(number,type)VALUES(1234,'A'),(2345,'B'),...'。 – deceze