-1

我在 postgresql创建表页面上看到了这个:

CREATE TABLE films (
    code        char(5),
    title       varchar(40),
    did         integer,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute,
    CONSTRAINT code_title PRIMARY KEY(code,title)
);

我得到了类似的约束,CHECK (price > 0)但我不知道这意味着主键在哪里传递代码和标题之类的参数。

这个设置是否都是主键?

是否可以有两个主键?

4

2 回答 2

8

这不是两个主键,而是一个复合主键。

这意味着主键由两列codetitle(因此是code_title约束名称)组成。

因此,虽然您可以拥有具有重复代码和重复标题的行,但没有两行可以具有相同的code/title组合:

code  title
----  -----
0000  aaaaa    Okay.
0000  bbbbb    Okay.
1111  bbbbb    Okay.
0000  aaaaa    ** No! Conflicts with first row. **
于 2013-06-11T04:00:09.130 回答
0

正如paxdiablo所说,您拥有的是复合键。

+-------+
|A B C D|
+-------+
|1 2 2 3|
+-------+
|2 3 2 4|
+-------+
|3 2 2 3|
+-------+
|4 4 3 2|
+-------+

-A 可以是这里的主键,因为它没有重复的行

+-------+
|A B C D|
+-------+
|1 2 3 2|
+-------+
|1 3 2 3|
+-------+
|2 2 3 2|
+-------+
|1 1 3 3|
+-------+

-A 在这里不能是主键,因为它有重复的行 -A,B 可以是复合键,结合起来它们没有重复的行 (12, 13, 22, 11)

此外,不,不可能有多个主键。在主键之后,您可以拥有唯一键,这将防止该列重复,但主键会自动设置为索引。

于 2013-06-11T04:08:19.247 回答