是否可以在多个表中创建唯一(索引)约束?

问题描述:

有没有办法在MySQL数据库中的表中创建唯一的索引?是否可以在多个表中创建唯一(索引)约束?

通过独特的,我的意思是,

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

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

不幸的是,这个约束(一个“分布式密钥”)不可能被建模为一个标准的SQL关系约束。它可以用几种方式进行模拟,但我有各种各样的方法,通常是“icky” - 虽然我有时仍然在尝试! - 尽最大努力避免这种情况。如果可能的话,我建议尝试以更“SQL友好”的方式表示模型。 – 2013-02-12 05:01:49

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

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

其次,是通过创建第三个表格,其中包含UNIQUE号码和其他表格:TableATableB将在第三个参考。

就像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'into a):

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

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

+0

'LAST_INSERT_ID'可能会在高并发系统中产生意外的行为。 – singe3 2016-03-31 10:07:17

+1

LAST_INSERT_ID在高度并发的系统上没有任何问题。请参阅http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id上的文档,其中指出:“生成的标识在服务器上按照每个标准进行维护,这意味着函数返回给定客户端的值是该客户端最近一次影响AUTO_INCREMENT列的语句生成的第一个AUTO_INCREMENT值,该值不会受到其他客户端的影响,即使它们生成的AUTO_INCREMENT值为他们自己的。”你在想SQL Server吗? – 2016-04-20 22:40:10

+0

不,你想的是有些人使用LAST_INSERT_ID()+ 1来插入另一个值,如果已经采用了id + 1,这可能会失败。 – singe3 2016-04-21 06:44:28