Различия в синтаксисе MySQL / PostgresSQL для внешних ключей - PullRequest
0 голосов
/ 01 ноября 2018

Я использовал много баз данных, которые другие люди создавали с использованием внешних ключей, но только недавно научился включать их самостоятельно.

Из этого ответа видно, что следующие два утверждения с и без '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 голосов
/ 01 ноября 2018

Существует несколько способов выразить отношение внешнего ключа в операторе создания таблицы. Вот несколько способов:

Встроенный в определение столбца:

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 для встроенных определений внешнего ключа).

Явное определение является более общим (обработка нескольких столбцов). Я склонен предпочесть явно названные ограничения. Я допускаю, что иногда использую встроенную версию просто потому, что она удобнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...