SQLite错误:无法在具有非常基本表的事务中启动事务



我是SQL的新手,正在学习SQLite编辑器。所以我创建了几个非常简单的表。这段代码直接来自Linkedin学习的"SQL基本培训",我正在使用推荐的SQLite编辑器。

CREATE TABLE widgetInventory(
id INTEGER PRIMARY KEY,
description TEXT,
onhand INTEGER NOT NULL);
CREATE TABLE widgetSales(
id INTEGER PRIMARY KEY,
inv_id INTEGER,
quan INTEGER,
price INTEGER);

然后我用一些数据更新widgetInventory

INSERT INTO widgetInventory (description, onhand) VALUES ('rock', 25);
INSERT INTO widgetInventory (description, onhand) VALUES ('paper', 25);
INSERT INTO widgetInventory (description, onhand) VALUES ('scissors', 25);

接下来,我想用sale更新widgetSales表,并更新widgetInventory表以记录onhand的减少。

BEGIN TRANSACTION;
INSERT INTO widgetSales (inv_id, quan, price) VALUES (1,5,500);
UPDATE widgetInventory SET onhand = (onhand-5) WHERE id = 1;
END TRANSACTION;

我不明白为什么在运行它时会出现错误,因为它与课程中的内容完全一样。

[06:18:04] Error while executing SQL query on database 'test': cannot start a transaction within a transaction

但是,我可以分别运行INSERTUPDATE行,它们做我想让它们做的事情。

显然,正在运行-END TRANSACTION;-在运行之前,整个事务似乎工作正常。

我认为,不知怎么的,SQL认为事务已经发生了。不过,我不确定具体在哪里。因此,要停止它,您必须先结束事务,然后再继续课程。

在SQLite编辑器中,您可能需要删除或注释掉这两个事务前后的所有代码。

BEGIN TRANSACTION;
INSERT INTO widgetSales ( inv_id, quan, price ) VALUES ( 1, 5, 500 );
UPDATE widgetInventory SET onhand = ( onhand - 5 ) WHERE id = 1;
END TRANSACTION;
BEGIN TRANSACTION;
INSERT INTO widgetInventory ( description, onhand ) VALUES ( 'toy', 25 );
ROLLBACK;

否则它将不会执行事务。

除此之外,可能在某个地方写了一个错误。在.txt文件中复制和粘贴不会给我带来事务错误,并且可以正常执行事务。

刚刚出现了同样的错误,我的问题是我只突出显示了第一行,所以SQLLite启动了事务,但没有完全运行。我所做的只是运行最终事务,突出显示整个代码块并运行它,它运行得很好。Lite中一定有语法问题,它本身没有运行完整的块。

在数据库'test'上执行SQL查询时:无法启动交易中的交易表示事务已存在。如果有人忘记选择END TRANSACTION;语句,则可能会发生这种情况。如果遇到此问题,只需选择END TRANSACTION一次并运行即可。这样它将结束活动事务,然后您可以运行任何现有事务。

对于遵循Linkedin学习的特殊情况"SQL基本训练";当然,我已经找到了通过运行(f9(";BEGIN TRANSACTION"。。。事务内容"以及";结束交易";单独的语句,而不是同时使用所有语句。

所以,

  1. 首先选择";开始交易"然后按f9运行
  2. 然后选择事务的内容(我认为您还可以包括"END TRANSACTION"部分(并运行它

最新更新