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

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

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

<createTable tableName="wallet_information"
             remarks="A table to contain wallet data">
    <column name="id" type="bigint(20)" autoIncrement="true">
        <constraints nullable="false" primaryKey="true"/>
    </column>
    <column name="user_uuid" type="varchar(255)">
        <constraints nullable="false"/>
    </column>
    <column name="wallet_name" type="varchar(255)">
        <constraints nullable="false"/>
    </column>
    <column name="wallet_address" type="varchar(63)">
        <constraints nullable="false"/>
    </column>
    <column name="verification_challenge_id" type="bigint(20)">
        <constraints nullable="true"/>
    </column>
</createTable>

还有:

<createTable tableName="verification_challenge"
             remarks="A table to contain challenge data">
    <column name="id" type="bigint(20)" autoIncrement="true">
        <constraints nullable="false" primaryKey="true"/>
    </column>
    <column name="challenge_type" type="varchar(255)">
        <constraints nullable="false"/>
    </column>
</createTable>

最后:

<addForeignKeyConstraint baseTableName="wallet_information" 
        baseColumnNames="verification_challenge_id"
        constraintName="verification_challenge_fk"
        referencedTableName="verification_challenge" 
        referencedColumnNames="id"
        onDelete="CASCADE"/>

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

kq4fsx7k

kq4fsx7k1#

TL;DR

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

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

<addForeignKeyConstraint baseTableName="wallet_information" 
        baseColumnNames="verification_challenge_id"
        constraintName="verification_challenge_fk"
        referencedTableName="verification_challenge" 
        referencedColumnNames="id"
        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=级联逻辑将与您所期望的匹配。

相关问题