使用没有 FOREIGN KEY 的 REFERENCES 是否仍会创建外键?

tec*_*oke 4 sql postgresql

我之前做过一些 SQL 但没有加载。如果在创建表时不使用 FOREIGN KEY 使用它,我对 REFERENCES 的作用有点困惑,例如

author_id INTEGER REFERENCES users(id),
Run Code Online (Sandbox Code Playgroud)

相对于...

FOREIGN KEY (author_id) REFERENCES users(id)
Run Code Online (Sandbox Code Playgroud)

如果这些不同,有什么区别?如果它们相同,应该首选哪种形式?

The*_*ler 6

第一个:

author_id INTEGER REFERENCES users,
Run Code Online (Sandbox Code Playgroud)

...是以下的简写:

author_id INTEGER REFERENCES users (id),
Run Code Online (Sandbox Code Playgroud)

...这是以下的简写:

FOREIGN KEY (author_id) REFERENCES users (id)
Run Code Online (Sandbox Code Playgroud)

...这又是 SQL 标准的简写:

CONSTRAINT <constraint-name> 
FOREIGN KEY (<column>) 
REFERENCES <table>(<columns>)
Run Code Online (Sandbox Code Playgroud)

第一个涵盖了基本的、最常见的情况,并且很简洁。好的。

现在,完整的语法涵盖了具有所有可能变化的一般情况。考虑例如:

  • 复合外键

    book_id int not null,
    chapter_id int not null,
    constraint fk1 foreign key (book_id, chapter_id) 
      references chapter (book_id, chapter_id)
    
    Run Code Online (Sandbox Code Playgroud)

    由于是复合键,所以不能在列级别指定,而是在表级别指定。

  • 分叉外键

    owner_id int not null,
    constraint fk2 foreign key (owner_id) references person (id),
    constraint fk3 foreign key (owner_id) references company (id)
    
    Run Code Online (Sandbox Code Playgroud)

    在这种情况下,同一列指向多个表。想象一下这个与复合外键相结合的......

通常,您偶尔会看到复合键,并且很少看到外键。大多数情况下,您会看到简单的外键,这就是速记语法如此有用的原因。