为什么这个外键不适用于 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')
.
的用户
我有两个 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')
.