#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. Нет, я не думаю, что это вообще обычная практика. Даже без ограничений бизнес-логика в приложении обычно предотвращает потерянные записи.