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

标签 sql postgresql

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

author_id INTEGER REFERENCES users(id),

相对于...
FOREIGN KEY (author_id) REFERENCES users(id)

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

最佳答案

第一个:

author_id INTEGER REFERENCES users,

...是以下的简写:
author_id INTEGER REFERENCES users (id),

...这是以下的简写:
FOREIGN KEY (author_id) REFERENCES users (id)

...这又是 SQL 标准的简写:
CONSTRAINT <constraint-name> 
FOREIGN KEY (<column>) 
REFERENCES <table>(<columns>)

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

现在,完整的语法涵盖了具有所有可能变化的一般情况。考虑例如:
  • 复合外键 :
    book_id int not null,
    chapter_id int not null,
    constraint fk1 foreign key (book_id, chapter_id) 
      references chapter (book_id, chapter_id)
    

    由于是复合键,所以不能在列级别指定,而是在表级别指定。
  • fork 外键 :
    owner_id int not null,
    constraint fk2 foreign key (owner_id) references person (id),
    constraint fk3 foreign key (owner_id) references company (id)
    

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

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

    关于sql - 使用没有 FOREIGN KEY 的 REFERENCES 是否仍会创建外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61106538/

    相关文章:

    javascript - 在 Node API 混淆中使用 knex.js 编写插入语句

    postgresql - 我应该使用分片吗?

    sql - SQL Server 中的 Oracle 样式联接

    sql - PostgreSQL:表仅引用复合主键的一部分

    database - 将列添加到表和 View 时锁定

    mysql - 如何检查 MySQL 中的 BIT 数据类型?

    postgresql - 一个模式中的 Flyway 多个元数据表

    mysql - EAV如何存储额外的字段值?

    mysql - 在 MySQL 中隐藏别名列

    Mysql:对连接两个表的查询感到困惑