我想限制多个表之间的ID数。我们说我有4张产品表。每个表都有一个ID,但是我想限制ID的数量,这样我就不能复制它在其中一个表上已存在的数字。让我们说我在一张桌子上有ID 43,我想"拒绝"它在另一张桌子上,所以我不能再使用它,因为它已经在那张桌子上创建了。 谢谢!
答案 0 :(得分:1)
有一张第5张表格可以显示出来的ID。在那里,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
特定于连接,因此不可能将数字与另一个连接混淆。
答案 1 :(得分:0)
当您插入新行时,您应该LOCK all four tables (for data insert)启动事务,读取每个表的ID的最大值并选择最大值,将该值加1并插入新行,然后完成事务并解锁表。
这是基本的解决方案,您可以尝试通过在某个地方保存最后一个最大ID来优化它。表锁定确保当许多并发线程(例如来自php)将插入行时,ID将是唯一的。
可能您可以使用触发器(因此在应用程序端但在数据库端没有)。