Grails: не удается удалить или обновить родительскую строку: сбой ограничения внешнего ключа

#grails #groovy #grails-orm

#grails #groovy #grails-orm

Вопрос:

Итак, у меня есть 2 таблицы в классе домена grails, одна из которых — Customer, а другая — Customer Client.Клиент-клиент имеет внешний ключ Клиента. Вот код для моего клиентского домена:

 
class Customer {
    String code
    String name
    String contactPerson
    String status


    static hasOne = [customerClient: CustomerClient]

    static constraints = {
        status maxSize:8
        contactPerson nullable: true
        name nullable: false
        status nullabale: false
        customerClient nullable: true
    }
}
  

и вот код для моего клиентского домена клиента:

 package workdatabase4

class CustomerClient {
    String zendeskApiToken
    String zendeskUrl
    String clientChannelId
    String clientName
    String clientChannel
    String status
    String zendeskApiAuth
    String channelAccessToken

    static belongsTo = [customer: Customer]

    static constraints = {
        clientName nullable: true
    }
}

  

У меня нет функции удаления в моем контроллере, я просто попытался удалить ее вручную через базу данных в intellij, и я получил эту ошибку:

 [23000][1451] Cannot delete or update a parent row: a foreign key constraint fails (`customerclient`.`customer_client`, CONSTRAINT `FKgobbh6gqke89v6a7rdsfcdu2o` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`))
  

Мой вопрос в том, как я могу удалить клиента, не удаляя сначала клиента клиента?
Спасибо.

Ответ №1:

Это называется каскадным удалением. Дело в том, что если вы удалите родительскую строку, в базе данных останется множество дочерних строк, которые вы больше не сможете найти.

Я тоже новичок в Grails. Я не уверен, сработает это или нет.

Я гуглю «каскад grails». Google указывает мне на страницу документа grails. В нем есть пример, в котором говорится, что нужно добавить каскадную запись в блок сопоставления с классом домена.

Если это не сработает, вам придется изменить настройку каскадного удаления непосредственно из системы баз данных. База данных может заблокировать удаление родительской строки.

 class Author {

    static hasMany = [books: Book]

    static mapping = {
        books cascade: 'all-delete-orphan'
    }
}