小编典典

序列类型的外键-确保始终手动填充

sql

我有两个表:国家和地区。

CREATE TABLE Countries(
    id     SERIAL,
    name   VARCHAR(40) NOT NULL,
    PRIMARY KEY(id)
)

CREATE TABLE Regions(
    id           SERIAL,
    countryId    SERIAL,
    name         VARCHAR(40) NOT NULL,
    PRIMARY KEY(id       ),
    FOREIGN KEY(countryId) REFERENCES Countries(id)
)

当我插入区域时,我希望如果我不提countryId,我会停下来,但是countryId会自动递增。有什么方法可以让我自动停止进行插入吗?

下表我设置countryIDSERIAL NOT NULL不能解决问题。

CREATE TABLE Pigeons(
    id           SERIAL,
    countryId    SERIAL NOT NULL,
    name         VARCHAR(40) NOT NULL,
    PRIMARY KEY(id       ),
    FOREIGN KEY(countryId) REFERENCES Countries(id)
)

以下内容解决了该问题,但我认为这在技术上是不正确的,因为我的序列号可能大于2 ^ 31,但int永远不会> = 2 ^ 31。

CREATE TABLE Legions(
    id           SERIAL,
    countryId    INT NOT NULL,
    name         VARCHAR(40) NOT NULL
    PRIMARY KEY(id       ),
    FOREIGN KEY(countryId) REFERENCES Countries(id)
)

这里正确的方法是什么?


阅读 171

收藏
2021-04-22

共1个答案

小编典典

我会建议:

CREATE TABLE country(
    country_id serial PRIMARY KEY
  , country    text NOT NULL
);

CREATE TABLE region(
    region_id  serial PRIMARY KEY
  , country_id int NOT NULL REFERENCES country
  , region     text NOT NULL
);
  • 不要使用CaMeL案例名称。阅读有关标识符的手册。
  • 使用专有名称。从不idname,这不是描述性的。
  • a的基础类型serialinteger。创建引用列integer
    由于有外键引用,region.country_id因此只能保存country.country_id(或NULL)中存在的值。您无需考虑有关值>
    2 ^ 31的问题。

  • 演示PK和FK定义的较短语法(可选)。阅读上的手册CREATE TABLE

2021-04-22