Удалить строку таблицы, ключ которой связан с другой таблицей как внешний ключ

#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 с int

2. Отсортируйте запрос непосредственно в 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 . Поскольку существуют другие способы выражения предполагаемой логики, моя рекомендация — привыкнуть использовать эти другие способы, чтобы избежать ошибок в будущем.