语法差异MySQL / PostgresSQL外键

时间:2018-11-01 09:48:15

标签: mysql sql postgresql

我使用了其他人用外键构建的许多数据库,但是直到最近我才开始学习如何自己包含它们。

this answer可以看出,以下两个带有和不带有“ 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/

两种方言在语法上有什么区别?

1 个答案:

答案 0 :(得分:2)

有多种方法可以在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关键字)

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