Кроме того, внешний ключ должен / должен ссылаться на первичный ключ. Что если я не знаю первичный ключ, но я знаю другой уникальный столбец, в данном случае имя пользователя, как мне получить первичный ключ из другого оператора MySQL или, альтернативно, указать, что внешний ключ указывает на не первичный ключ?
Да, если у вас есть другой уникальный ключ, вы можете использовать внешние ключи, ссылающиеся на него:
CREATE TABLE user
( userid INT NOT NULL
, username VARCHAR(20) NOT NULL
--- other fields
, PRIMARY KEY (userid)
, UNIQUE KEY (username)
) ENGINE = InnoDB ;
CREATE TABLE picture
( pictureid INT NOT NULL
, username VARCHAR(20)
--- other fields
, PRIMARY KEY (pictureid)
, FOREIGN KEY (username)
REFERENCES user(username)
) ENGINE = InnoDB ;
И если все внешние ключи в других таблицах ссылаются на этот уникальный ключ (username
), бессмысленно иметь бессмысленный идентификатор. Вы можете бросить его и сделать username
PRIMARY KEY
таблицы.
(Edit :)
Есть несколько точек, имеющих автоинкрементный первичный ключ для таблиц InnoDB, даже если он не используется в качестве ссылки, поскольку первый первичный или уникальный индекс по умолчанию сделан индексом кластеризации таблицы. Основное поле char может иметь недостатки производительности для операторов INSERT
и UPDATE
, но лучше работать в запросах SELECT
.
Для обсуждения относительно того, что использовать, суррогатные (бессмысленные, автоматически генерируемые) или естественные ключи и различные взгляды на предмет, прочитайте это: surrogate-vs-natural-business-keys