我使用了其他人用外键构建的许多数据库,但是直到最近我才开始学习如何自己包含它们。
从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/)
两种方言在语法上有什么区别?
答案 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
关键字)
显式定义更为通用(处理多个列)。我倾向于使用显式命名的约束。我承认有时会使用内联版本,只是因为它更方便。