是否可以在多个表中创建唯一(索引)约束?
有没有办法在MySQL数据库中的表中创建唯一的索引?是否可以在多个表中创建唯一(索引)约束?
通过独特的,我的意思是,
table A ids=1,2,5,7...
table B ids=3,4,6,8...
我认为,它是不可能通过直接创建的约束。但为了让您获得唯一的ID,有一些解决方案。
一个建议是使用TRIGGER
。在两个表上创建一个BEFORE INSERT触发器,在INSERT
或UPDATE
期间检查ID是否存在。
其次,是通过创建第三个表格,其中包含UNIQUE
号码和其他表格:TableA
和TableB
将在第三个参考。
就像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中。
'LAST_INSERT_ID'可能会在高并发系统中产生意外的行为。 – singe3 2016-03-31 10:07:17
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
不,你想的是有些人使用LAST_INSERT_ID()+ 1来插入另一个值,如果已经采用了id + 1,这可能会失败。 – singe3 2016-04-21 06:44:28
不幸的是,这个约束(一个“分布式密钥”)不可能被建模为一个标准的SQL关系约束。它可以用几种方式进行模拟,但我有各种各样的方法,通常是“icky” - 虽然我有时仍然在尝试! - 尽最大努力避免这种情况。如果可能的话,我建议尝试以更“SQL友好”的方式表示模型。 – 2013-02-12 05:01:49