为什么这个外键不适用于 knex 中的删除操作?

Why this foreign key is not working for delete action in knex?

我有两个 table,地址和用户,每个用户都有一个地址,table 用户中有一列 'address_id' 引用地址中的一行 table.但是,当我删除用户时,地址行不会被删除。为什么?

table_users:

exports.up = function(knex) {
    return knex.schema.createTable('users', function(table) {
        table.increments('id')
        table.text('name')
        table.text('cpf').unique()
        table.text('email').unique()
        table.text('pass')
        table.text('phone')
        table.timestamp('last_access').defaultTo(knex.fn.now())
        table.timestamp('created_at').defaultTo(knex.fn.now())
        table.timestamp('deleted_at').defaultTo(null)
        table.integer('address_id').unsigned()
        table.foreign('address_id').references('addresses.id').onDelete('CASCADE')
    })
};

exports.down = function(knex) {
    return knex.schema.dropTable('users')
};

table_addresses:

exports.up = function(knex) {
    return knex.schema.createTable('addresses', function(table) {
        table.increments('id')
        table.text('street')
        table.text('number')
        table.text('complement')
        table.text('city')
        table.text('state')
        table.text('country')
        table.timestamp('last_access').defaultTo(knex.fn.now())
        table.timestamp('created_at').defaultTo(knex.fn.now())
        table.timestamp('deleted_at').defaultTo(null)
    })
};

exports.down = function(knex) {
    return knex.schema.dropTable('addresses')
};

删除函数:

const del = (req, res, next) => { // TODO: colocar transaction aqui também
        knex('users').where({
            id: req.userData.id
        }).first().del().then(r => {

            if (!r) {
                throw new CompleteError('Falha ao deletar usuário.', 400)
            }

            res.status(200).json({
                sucess: true,
                data: {
                    message: 'Usuário deletado com sucesso.'
                }
            })
        }).catch(e => {
            return next(e)
        })
    }

根据您当前的定义,引用是反向工作的,这意味着每当您删除 地址 时,它都会删除引用的用户。

如果你希望每当你删除一个用户时它都会删除地址,你需要在addresses中添加一个引用table 给 onDelete('cascade').

的用户