#mysql #sql #database
#mysql #sql #База данных
Вопрос:
Я только начал возиться с mysql. У меня есть три таблицы.
PURCHASEORDERS
PURCHASEORDERLINE(HAS A FOREIGN KEY OF PURCHASEORDERID AND STOREROOM ID)
STOREROOM
Я пытался удалить строку из purchaseorders и понял, что это будет проблемой, поскольку она ссылается на внешний ключ purchaseorderline.
Теперь, насколько я понимаю, я должен был бы сказать (в псевдокоде)
delete from purchaseorders where purchaseid not exists in
purchaseorderline.purchaseid
Есть предложения, как я могу выразить это в терминах mysql?
Комментарии:
1.
PreparedStatement statement = this.connection.prepareStatement("DELETE FROM " this.table " WHERE " this.ID " = ? NOT IN ( SELECT PURCHASEORDERLINE." this.ID " FROM " " PURCHASEORDERLINE WHERE " this.ID " IS NOT NULL)");
и я получаю сообщение об ошибкеjava.sql.SQLSyntaxErrorException: Comparisons between 'BOOLEAN' and 'INTEGER' are not supported. Types must be comparable. String types must also have matching collation. If collation does not match, a possible solution is to cast operands to force them to the default collation
Я не вижу, где я сравниваю bool с int2. Отсортируйте запрос непосредственно в mysql, прежде чем беспокоиться о вводе Java. Как только это заработает в чистой среде SQL, вы можете отсортировать часть Java. Не путайте проблему
3. Я использую только java netbeans. Я использую Mysql только для проекта Java.
4. Итак? Получите запрос прямо в mysql, а затем перенесите его в Java. Тогда вы узнаете, работает ли сам SQL. После этого вы можете попробовать запустить ее через Java
5. Я попробовал это на чистом sql и получил ту же ошибку. Я думаю, логически это неправильно?
Ответ №1:
просто используйте не в
delete from purchaseorders where purchaseid not in
( select purchaseorderline.purchaseid from purchaseorderline where
purchaseid is not null
)
Комментарии:
1.
PreparedStatement statement = this.connection.prepareStatement("DELETE FROM " this.table " WHERE " this.ID " = ? NOT IN ( SELECT PURCHASEORDERLINE." this.ID " FROM " " PURCHASEORDERLINE WHERE " this.ID " IS NOT NULL)");
и я получаю сообщение об ошибкеjava.sql.SQLSyntaxErrorException: Comparisons between 'BOOLEAN' and 'INTEGER' are not supported. Types must be comparable. String types must also have matching collation. If collation does not match, a possible solution is to cast operands to force them to the default collation
Ответ №2:
Кажется, вам нужен not exists
подзапрос:
delete from purchaseorders po
where not exists (select 1
from purchaseorderline pol
where po.purchaseid = ol.purchaseid
);
Эквивалентная формулировка — это left join
:
delete po
from purchaseorders po left join
purchaseorderline pol
on po.purchaseid = ol.purchaseid
where pol.purchaseid is null;
Я настоятельно не рекомендую вам использовать NOT IN
с подзапросом. Он ведет себя не так, как ожидалось, если какие-либо значения в подзапросе возвращаются NULL
. Поскольку существуют другие способы выражения предполагаемой логики, моя рекомендация — привыкнуть использовать эти другие способы, чтобы избежать ошибок в будущем.