我一直在研究MySQL中的MUL密钥,据我了解,该密钥允许多次出现给定值。对我而言,唯一性意味着该值可以在该列中多次出现。
1)。我对此是否正确理解
2)。是否有必要在PostgreSQL中复制MUL密钥
如果问题的答案是肯定的,那么...
3)。如何在PostgreSQL中创建MUL密钥
谢谢
答案 0 :(得分:2)
MUL密钥只是意味着该密钥是MySQL中索引(不是唯一索引)的一部分。
这种键没有什么特别的。在两个数据库中,都可以使用CREATE INDEX
创建这样的索引。尽管MySQL似乎违反了标准SQL,但您不应将此类密钥用于外键约束。
答案 1 :(得分:1)
从戈登的答案中,我了解了此MySQL 功能。 PostgreSQL(幸运的是,我必须添加)没有它。
回顾一下您的问题:
1)。我对此是否正确理解
是的,您的理解在MySQL语言中是正确的。但是,重要的是要了解,在关系数据库世界中,“键”的概念暗示着唯一性。但是,在MySQL中,它是“索引”(唯一和非唯一)的同义词。在这种情况下,MUL
的意思是:非唯一索引。
2)。是否有必要在PostgreSQL中复制MUL密钥
PostgreSQL有索引,唯一索引是非唯一索引。它们涵盖了与MySQL的“键”相同的基础,除了“导出外键”的额外功能(我最多认为是粗略的)之外。 PostgrSQL不允许使用它们。无论如何,最好远离他们。
如果问题的答案是肯定的,那么...
对于上述警告,答案为“是”。
3)。如何在PostgreSQL中创建MUL密钥
只需创建一个简单的索引。例如:
create index ix1 on my_table (my_column);
您可以在索引中包含多个列,并以逗号分隔。默认情况下不唯一。
我为什么要远离非唯一导出的外键?
您可能会问为什么导出非唯一密钥可能会成为问题?参见以下示例:
create table t (a int, b int);
create index ix1 on t (a);
insert into t (a, b) values (null, 1), (123, 2), (456, 3), (456, 4);
create table u (
c int,
constraint fk1 foreign key (c) references t (a) on update cascade
);
-- the statement above makes column "a" an Exported Foreign Key.
insert into u (c) values (null), (123), (456);
-- row 456 in table u, points to two rows (3 and 4) in table t.
update t set a = a + 1 where b = 4;
-- after updating, row 456 in table u, points to a single row in t
请参见DB Fiddle上的运行示例。
在此示例中,您可以验证外键关系在单个UPDATE
之后是否最终被破坏。