如果第二次插入失败,如何安全地多次插入到具有外键关系的SQL表,并删除第一次插入

时间:2017-06-16 06:12:49

标签: sql knex.js

我有这些拖表:

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

在进行插入事务时,如何确保如果在插入表城市后插入表格天气时出现错误,我可以返回并删除表格城市中的插入以确保数据库完整性。 我只需要一瞥我能做些什么。

2 个答案:

答案 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。 由于citycities表中的主键,当weather表中的插入失败时,您可以使用 WHERE 条件删除来自城市表的条目 - {{1 }}。
NEW.city表示当前插入天气表并插入的城市值已失败。