Имеет ли смысл проверять, существует ли внешний ключ в исходной таблице?

#mysql

#mysql

Вопрос:

Я наткнулся на некоторый код, который я бы так не написал. Тем не менее, я бы не считал себя экспертом по MYSQL, и поэтому мне интересно, не упускаю ли я чего-то.

Для лучшего понимания: я хочу получить только s.SpecialID из этого запроса и только в том случае, если в моей таблице есть внешний ключ s otherTable . Код

 SELECT Distinct s.SpecialID
FROM sample s, otherTable o
WHERE s.otherTableID = o.id 
  

Я бы написал это как

 SELECT Distinct s.SpecialID
FROM sample s
IF s.otherTableID IS NOT NULL
  

Комментарии:

1. SELECT DISTINCT s.specialID from SAMPLE s JOIN OTHERTABLE o ON(s.othertableID = o.id)

2. Что вы имеете в виду под этим? @user207421

3. Это было задумано как предложение переписать SQL-запрос, который является предметом вашего вопроса. Это кажется довольно очевидным. Ваш способ не эквивалентен.

4. @user207421 но разве цель объединения не в том, чтобы возвращать столбцы из нескольких разных таблиц в одной таблице? В моем примере этого не происходит, верно?

Ответ №1:

Если вы используете InnoDB и фактически объявили связь с внешним ключом в схеме таблицы, тогда нет необходимости проверять, существует ли внешний ключ. MySQL автоматически выполнит это требование. Тогда ваша вторая версия должна быть эквивалентной, поскольку любое ненулевое значение должно существовать в главной таблице.

Но если вы используете MyISAM, ограничения внешнего ключа не применяются автоматически. В этом случае может потребоваться выполнить тест явно с помощью соединения.

Комментарии:

1. Хорошо, так можно ли считать это хорошей практикой, потому что базовая база данных может измениться?

2. Нет, я не думаю, что это вообще обычная практика. Даже без ограничений бизнес-логика в приложении обычно предотвращает потерянные записи.