【问题标题】:Is it possible to create a Unique (Index) constraint across multiple tables?是否可以跨多个表创建唯一(索引)约束?
【发布时间】:2013-01-27 08:21:36
【问题描述】:

有没有办法在 MySQL 数据库中的表之间创建唯一索引?

我的意思是独一无二的,

                table A ids=1,2,5,7... 

                table B ids=3,4,6,8...

【问题讨论】:

  • 不幸的是,此约束(“分布式键”)无法建模为标准 SQL 关系约束。它可以通过多种方式进行模拟,但我有各种通常“恶心”的方法——尽管我有时仍会继续尝试! - 这些天尽我所能避免这种情况。如果可能的话,我建议尝试以更“SQL 友好”的方式来表示模型。

标签: mysql sql database unique-constraint


【解决方案1】:

我认为,直接创建约束是不可能的。但是有一些解决方案可以让您获得唯一的 ID。

一个建议是使用TRIGGER。在两个表上创建一个 BEFORE INSERT 触发器,用于在 INSERT 或 UPDATE 期间检查 ID 是否存在。

其次,创建第三个表,其中包含 UNIQUE 数字和其他表:TableA 和 TableB 然后将在第三个表中引用。

【讨论】:

    【解决方案2】:

    正如 JW 所说,这可能与使用第三张桌子配合得很好。在 MySQL 中,您可以使用标识字段来简化此操作。一个非常简单的例子是使用这些表(表的简单版本,只有名称,不知道任何进一步的信息):

    CREATE TABLE a
      (
        `id` int,
        `name` varchar(100),
        PRIMARY KEY(`id`)
      )
      ENGINE = INNODB;
    CREATE TABLE b
      (
        `id` int,
        `name` varchar(100),
        PRIMARY KEY(`id`)
      )
      ENGINE = INNODB;
    CREATE TABLE c
      (
        `id` int auto_increment,
        `intable` varchar(10) not null,
        PRIMARY KEY(`id`)
      )
      ENGINE = INNODB;
    

    然后,当您想在任一表上插入值时,执行(将“Joe”插入 a 的示例):

    INSERT INTO c (`intable`) VALUES ('a');
    INSERT INTO a (`id`, `name`)
      SELECT LAST_INSERT_ID() AS id, 'Joe' AS name;
    

    在 c 中使用 intable 条目的唯一原因是让您知道它是为哪个表创建的。可以使用任何类型的值插入到 c 中。

    【讨论】:

    • LAST_INSERT_ID 可能会在高并发系统中产生意外行为。
    • LAST_INSERT_ID 在高并发系统上没有任何问题。请参阅dev.mysql.com/doc/refman/5.7/en/… 的文档,其中指出“生成的 ID 在服务器中基于每个连接进行维护。这意味着函数返回给给定客户端的值是为最近的语句生成的第一个 AUTO_INCREMENT 值影响该客户端的 AUTO_INCREMENT 列。此值不会受到其他客户端的影响,即使它们生成自己的 AUTO_INCREMENT 值。你在考虑 SQL Server 吗?
    • 不,你是对的,我在想有些人使用 LAST_INSERT_ID()+1 插入另一个值,如果 id+1 已经被占用,可能会失败。
    • 哦,是的,那会很糟糕!永远不要这样做,人们!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    相关资源
    最近更新 更多