我想限制多个表之间的ID数。假设我有4张产品。每个表都有一个ID,但是我想限制ID的数量,因此我无法复制这些数字之一。假设我在一个表中有ID 43,我想在另一个表上"拒绝"它,这样我就不能再使用它了,因为它已经在该表上创建了。谢谢!
有一个用于插入ID的第5个表。在那里,id
可以是AUTO_INCREMENT
(如果合适的话)。
- 从第五表获取新号码
-
INSERT
进入4个表的适当。
这两个步骤不需要在相同的"交易"中。
样本序列发生器:
-- Setup:
CREATE TABLE `seq` (
`id` INT UNSIGNED NOT NULL,
`code` char(1) CHARACTER SET ascii NOT NULL,
PRIMARY KEY (`code`)
) ENGINE=InnoDB;
INSERT INTO seq VALUES (0, 'a'); -- The only row for the table
-- Increment and get next value:
UPDATE seq
SET id = LAST_INSERT_ID(id + 1)
WHERE code = 'a';
SELECT LAST_INSERT_ID();
注意:UPDATE
和SELECT
可以在任何交易之外完成;处于autocommit=ON
模式。SELECT
是特定于连接的,因此没有机会将数字与另一个连接混合。
当您插入新行时,应该锁定所有四个表(用于数据插入),启动事务,读取每个表的ID的最大值并选择最大值,请在该最大值中添加1然后插入新行,然后完成交易并解锁表。
这是基本解决方案,您可以通过保存在某个位置的最后最大ID来尝试优化它。当许多并发线程(例如,从PHP)插入行时,表锁定确保ID将是唯一的。
可能是您可以使用触发器进行操作(因此,在应用程序侧没有,而是在DB侧)。