为什么此外键无法在knex中执行删除操作?

问题描述

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

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')
};

del函数

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)
        })
    }

解决方法

在您当前的定义下,引用将反向运行,这意味着,无论何时删除地址,它都会删除引用的用户。

如果您希望每当删除用户时都会删除该地址,则需要在地址表中为具有onDelete('cascade')的用户添加引用