如果第二次插入失败,如何使用delete first insert安全地对具有外键关系的SQL表进行多次插入

如果第二次插入失败,如何使用delete first insert安全地对具有外键关系的SQL表进行多次插入,sql,knex.js,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,

我有两张桌子:

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
);
我正在使用带有Knex JavaScript驱动程序的PostgreSQL

在执行insert事务时,如何确保在表城市中插入后,如果在表天气中插入时出错,我可以返回并删除表城市中的insert以确保数据库的完整性。 请让我看看我能做些什么。

你可以在天气表上插入触发器后再写。 由于您的城市是城市表中的主键,当在天气表中插入失败时,您可以使用WHERE condition-city=NEW.city从城市表中删除条目。 NEW.city表示当前正在气象表中插入且插入失败的city值。

您可以在气象表上插入触发器后写入。 由于您的城市是城市表中的主键,当在天气表中插入失败时,您可以使用WHERE condition-city=NEW.city从城市表中删除条目。
NEW.city表示当前正在气象表中插入的city值,但插入失败。

也许我理解的问题是错误的,但这听起来像是使用事务的基本情况。只需启动事务,执行插入,如果任何插入失败,则回滚。使用knex,您可以这样做:


您不应该为此使用触发器。

也许我理解的问题是错误的,但这听起来像是使用事务的基本情况。只需启动事务,执行插入,如果任何插入失败,则回滚。使用knex,您可以这样做:


您不应该为此使用触发器。

您使用的是什么RDM?mysql、oracel、MSSQL我如何插入并确保删除一个城市。。。这篇文章没有多大意义。你能试着重新措辞吗?你好,我已经编辑了问题Folks你在用什么RDM?mysql、oracel、MSSQL我如何插入并确保删除一个城市。。。这篇文章没有多大意义。你能试着重新措辞吗?你好,我已经编辑了这个问题让我试试这个。谢谢。请不要忘记投票并接受答案,如果这对你有效。当然@Keyur Panchal@Keyur Panchal它有效,但我不能投票。我的名声限制了我。Thanks@KeyurPanchal在这种情况下,使用触发器是错误的解决方案。在某些情况下,它可能会起作用,但对于这项工作来说,它是一个错误的工具。如果问题是如何打开一瓶葡萄酒,你可以用一只鞋轻敲瓶底来打开,但正确的答案应该是用螺丝钉。将此作为已接受/推广的答案保留在投票中,对于正在寻找正确解决方案的人来说,这只会让人感到困惑。让我试试这个。谢谢。请不要忘记投票并接受答案,如果这对你有效。当然@Keyur Panchal@Keyur Panchal它有效,但我不能投票。我的名声限制了我。Thanks@KeyurPanchal在这种情况下,使用触发器是错误的解决方案。在某些情况下,它可能会起作用,但对于这项工作来说,它是一个错误的工具。如果问题是如何打开一瓶葡萄酒,你可以用一只鞋轻敲瓶底来打开,但正确的答案应该是用螺丝钉。将此作为已接受/推广的答案保留在选票上,只会让那些正在寻找正确解决方案的人感到困惑。。。千万不要使用触发器执行OP描述的功能。对于那些认为这是一个好主意的初学者来说,这只是一种误导。。。千万不要使用触发器执行OP描述的功能。对于那些认为这是一个好主意的初学者来说,这只是一种误导。
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')
});