确保相同的ID不会影响多个表

时间:2017-12-05 10:15:57

标签: mysql database-design

我想限制多个表之间的ID数。我们说我有4张产品表。每个表都有一个ID,但是我想限制ID的数量,这样我就不能复制它在其中一个表上已存在的数字。让我们说我在一张桌子上有ID 43,我想"拒绝"它在另一张桌子上,所以我不能再使用它,因为它已经在那张桌子上创建了。 谢谢!

2 个答案:

答案 0 :(得分:1)

有一张第5张表格可以显示出来的ID。在那里,id可以是AUTO_INCREMENT(如果合适的话)。

  1. 从第5张表中获取新号码
  2. INSERT进入4个表中的相应表格。
  3. 这两个步骤不需要处于相同的交易中。

    样本序列生成器:

    -- 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();
    

    注意:UPDATESELECT可以(应该)在任何交易之外完成;处于autocommit=ON模式。 SELECT特定于连接,因此不可能将数字与另一个连接混淆。

答案 1 :(得分:0)

当您插入新行时,您应该LOCK all four tables (for data insert)启动事务,读取每个表的ID的最大值并选择最大值,将该值加1并插入新行,然后完成事务并解锁表。

这是基本的解决方案,您可以尝试通过在某个地方保存最后一个最大ID来优化它。表锁定确保当许多并发线程(例如来自php)将插入行时,ID将是唯一的。

可能您可以使用触发器(因此在应用程序端但在数据库端没有)。