mysql Liquibase:onDelete=“CASCADE”-删除父项不会删除子项,但删除子项会删除父项

zbdgwd5y  于 2022-11-21  发布在  Mysql
关注(0)|答案(2)|浏览(177)

我有两个实体(给你简化的版本):

  1. <createTable tableName="wallet_information"
  2. remarks="A table to contain wallet data">
  3. <column name="id" type="bigint(20)" autoIncrement="true">
  4. <constraints nullable="false" primaryKey="true"/>
  5. </column>
  6. <column name="user_uuid" type="varchar(255)">
  7. <constraints nullable="false"/>
  8. </column>
  9. <column name="wallet_name" type="varchar(255)">
  10. <constraints nullable="false"/>
  11. </column>
  12. <column name="wallet_address" type="varchar(63)">
  13. <constraints nullable="false"/>
  14. </column>
  15. <column name="verification_challenge_id" type="bigint(20)">
  16. <constraints nullable="true"/>
  17. </column>
  18. </createTable>

还有:

  1. <createTable tableName="verification_challenge"
  2. remarks="A table to contain challenge data">
  3. <column name="id" type="bigint(20)" autoIncrement="true">
  4. <constraints nullable="false" primaryKey="true"/>
  5. </column>
  6. <column name="challenge_type" type="varchar(255)">
  7. <constraints nullable="false"/>
  8. </column>
  9. </createTable>

最后:

  1. <addForeignKeyConstraint baseTableName="wallet_information"
  2. baseColumnNames="verification_challenge_id"
  3. constraintName="verification_challenge_fk"
  4. referencedTableName="verification_challenge"
  5. referencedColumnNames="id"
  6. onDelete="CASCADE"/>

然后,我使用Hibernate将一些数据持久化在这些表中。
目前,我没有从代码透视图中删除这些表中的任何数据,但是当我手动删除wallet_information中的条目时,verification_challenge中被引用的条目并没有随之删除。
但是当我删除verification_challenge中的条目时,wallet_information中引用的条目也被删除了。
我假设onDelete="CASCADE"的行为完全相反...
我做错了什么?

kq4fsx7k

kq4fsx7k1#

TL;DR

我假设onDelete=“CASCADE”的行为方式完全相反...

啊...不是真的,it works,因为它应该是,在您的共享代码

  1. <addForeignKeyConstraint baseTableName="wallet_information"
  2. baseColumnNames="verification_challenge_id"
  3. constraintName="verification_challenge_fk"
  4. referencedTableName="verification_challenge"
  5. referencedColumnNames="id"
  6. onDelete="CASCADE"/>

这意味着,每当您删除verification_challenge表中的记录时,所有在删除时具有级联的关联实体(如wallet_information)也将被删除。

dzjeubhm

dzjeubhm2#

我认为您的外键设置与业务逻辑的预期相反。
从Liquibase方面来看,它只是生成类似alter table wallet_information add constraint verification_challenge_fk ... on delete cascade的SQL,告诉数据库“当您有一个可能导致此约束失败的删除操作时,删除有问题的数据”。因此,在您的情况下,“当您删除验证挑战时,删除钱包信息”。
因此,您的修复方法应该是从wallet_information中删除verification_challenge_id列,并在verification_challenge中添加一个wallet_information_id列,然后,onDelete=级联逻辑将与您所期望的匹配。

相关问题