Почему этот внешний ключ не работает для действия удаления в knex?

#node.js #knex.js

#node.js #knex.js

Вопрос:

У меня есть две таблицы, адреса и пользователи, у каждого пользователя есть адрес, в таблице users есть столбец ‘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)
        })
    }
  

Комментарии:

1. Если вы используете SQLite3 iirc, вам необходимо настроить некоторую прагму для поддержки внешних ключей.

Ответ №1:

С вашим текущим определением ссылка работает в обратном направлении, это означает, что когда вы удаляете адрес, он удаляет пользователя, на которого ссылается.

Если вы хотите, чтобы всякий раз, когда вы удаляете пользователя, это приводило к удалению адреса, вам нужно добавить ссылку в таблицу адресов на пользователя с onDelete('cascade') .