0

我不明白之间的区别:

CREATE TABLE country(
   name VARCHAR,
   capital VARCHAR
);
CREATE TABLE people(
   name VARCHAR,
   grade INTEGER ,
   country VARCHAR,
   PRIMARY KEY (name, country),
   FOREIGN KEY country REFERENCES country(name)
);


CREATE TABLE country(
   name VARCHAR PRIMARY KEY,
   capital VARCHAR
);

CREATE TABLE people(
   name VARCHAR,
   grade INTEGER ,
   country VARCHAR,
   PRIMARY KEY (name, country),
   FOREIGN KEY country REFERENCES country
);

特别是,我不确定第二个是如何解释的。

4

2 回答 2

2

从外键约束中省略列名意味着约束将引用目标表的主键。从文档

您还可以将上述命令缩短为:

CREATE TABLE orders (
    order_id integer PRIMARY KEY,
    product_no integer REFERENCES products,
    quantity integer
);

因为在没有列列表的情况下,引用表的主键被用作引用列。

CREATE TABLE文档中:

REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] (column constraint)
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] (table constraint)

这些子句指定了一个外键约束,它要求新表的一组一个或多个列必须只包含与被引用表的某些行的被引用列中的值匹配的值。如果省略 refcolumn 列表,则使用 reftable 的主键。被引用的列必须是被引用表中不可延迟的唯一或主键约束的列。

于 2021-09-29T08:40:32.280 回答
1

在用于创建外键的 postgres 中,您应该喜欢FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]格式

有关创建表阅读文档的更多信息:https ://www.postgresql.org/docs/9.6/sql-createtable.html

样品 1:

CREATE TABLE country
(
    name    VARCHAR PRIMARY KEY,
    capital VARCHAR
);

CREATE TABLE people
(
    name    VARCHAR,
    grade   INTEGER,
    country VARCHAR,
    PRIMARY KEY (name, country),
    FOREIGN KEY (country) REFERENCES country (name)
);

样本 2:

CREATE TABLE country
(
    name    VARCHAR PRIMARY KEY,
    capital VARCHAR
);

CREATE TABLE people
(
    name    VARCHAR,
    grade   INTEGER,
    country VARCHAR REFERENCES country (name),
    PRIMARY KEY (name, country)
);
于 2021-09-29T08:14:04.220 回答