PostgreSQL中的MUL密钥等效于什么?

时间:2020-07-29 13:33:47

标签: mysql sql postgresql

我一直在研究MySQL中的MUL密钥,据我了解,该密钥允许多次出现给定值。对我而言,唯一性意味着该值可以在该列中多次出现。

1)。我对此是否正确理解

2)。是否有必要在PostgreSQL中复制MUL密钥

如果问题的答案是肯定的,那么...

3)。如何在PostgreSQL中创建MUL密钥

谢谢

2 个答案:

答案 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之后是否最终被破坏。

相关问题