我有这些拖表:
CREATE TABLE cities (
city varchar(80) primary key,
location point
);
CREATE TABLE weather (
city varchar(80) references cities(city),
temp_lo int,
temp_hi int,
prcp real,
date date
);
我正在使用PostgreSQL和Knex JavaScript Driver
在进行插入事务时,如何确保如果在插入表城市后插入表格天气时出现错误,我可以返回并删除表格城市中的插入以确保数据库完整性。 我只需要一瞥我能做些什么。
答案 0 :(得分:3)
也许我理解错误的问题,但这听起来像是使用交易的基本情况。只需启动事务,执行插入操作,如果任何插入操作无法回滚。使用knex
,您可以这样做(http://knexjs.org/#Transactions):
knex.transaction(trx => {
return trx('cities')
.insert({
city: 'inari',
... rest of the fields ...
})
.then(() => {
return trx('weather').insert({
city: 'inari',
... rest of the fields ...
});
});
})
.then(() => {
console.log('inserted 2 rows');
})
.catch(err => {
console.log('one of the queries failed, no rows were inserted and transaction was rolled back')
});
你不应该使用触发器。
答案 1 :(得分:0)
您可以在trigger
表上写 AFTER INSERT weather
。
由于city
是cities
表中的主键,当weather
表中的插入失败时,您可以使用 WHERE 条件删除来自城市表的条目 - {{1 }}。
NEW.city表示当前插入天气表并插入的城市值已失败。