【问题标题】:syntax differences MySQL / PostgresSQL for foreign keys外键的语法差异 MySQL / PostgresQL
【发布时间】:2018-11-01 09:48:14
【问题描述】:

我使用过许多其他人使用外键构建的数据库,但最近才开始学习如何将它们包含在内。

this answer可以看出,下面两个有'FOREIGN KEY'和没有'FOREIGN KEY'的语句是等价的:

author_id INTEGER REFERENCES author(id)

author_id INTEGER,
FOREIGN KEY(author_id) REFERENCES author(id)

然后以下在 Postgres 上完美运行,但在 MySQL 中产生错误:

CREATE TABLE cities (
        city     varchar(80) primary key,
        location point
);

CREATE TABLE weather (
        city      varchar(80) references cities(city),
        temp_lo   int,
        temp_hi   int,
        prcp      real,
        date      date
);

(在这里测试 - https://dbfiddle.uk/

这两种方言的语法有何不同?

【问题讨论】:

  • 为什么不在 Postgres 中尝试一下,看看会发生什么?
  • 我目前只安装了 Postgres.. - 怀疑它们都可以工作。你怎么看?
  • 你可以使用像dbfiddle这样的工具来做你需要的测试(MySQL / PostgreSQL)。
  • 谢谢@wchiquito 我认为有些不同,只是用代码编辑了问题,该代码在一个但不能在另一个中工作。

标签: mysql sql postgresql


【解决方案1】:

有多种方法可以在 create table 语句中表达外键关系。以下是一些方法:

与列定义内联:

city      varchar(80) references cities(city),

显式作为外键:

city      varchar(80),
. . .
foreign key (city) references cities(city),

显式作为约束:

city      varchar(80),
. . .
constraint fk_weather_city foreign key (city) references cities(city),

MySQL 不支持带有内联约束的第一个版本。大多数(如果不是所有)其他数据库都这样做。

第一个版本只处理具有单个列引用的外键,因此它不像其他方法那样通用(并且语法允许命名约束和内联外键定义的 foreign key 关键字)。

显式定义更通用(处理多列)。我倾向于更喜欢明确命名的约束。我承认有时会使用内联版本,只是因为它更方便。

【讨论】:

  • ...最好的做法是命名约束(所以第三个选项)
猜你喜欢
  • 2015-04-17
  • 1970-01-01
  • 2018-11-15
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2011-12-28
相关资源
最近更新 更多