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

lrpiutwd  于 2022-11-15  发布在  SQLite
关注(0)|答案(5)|浏览(229)

我是一个全新的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);

接下来,我想用销售更新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行,它们做我想让它们做的事情。

tv6aics1

tv6aics11#

显然,运行结束事务;-在运行整个事务之前似乎是工作的。
我认为,不知何故,SQL认为事务已经在发生。不过,我不确定具体在哪里。因此,要停止它,您必须先结束事务,然后再继续课程。

iqih9akk

iqih9akk2#

在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文件中复制和粘贴没有出现该事务错误,可以正常执行事务。

pexxcrt2

pexxcrt23#

我刚刚犯了同样的错误,我的问题是我只突出显示了第一行,所以SQLLite启动了事务,但没有完全运行它。我所做的就是运行End Transaction,突出显示整个代码块,然后运行它,它运行得很好。一定是Lite中有一些语法问题,它不会运行整个块本身。

2izufjch

2izufjch4#

在数据库‘test’上执行SQL查询时:无法在事务内启动事务意味着事务已存在。如果有人忘记选择END TRANSACTION;语句,就可能发生这种情况。如果您遇到这个问题,只需选择一次END TRANSACTION并运行即可。这样,它将结束活动事务,然后您可以运行任何现有事务。

x759pob2

x759pob25#

对于学习LinkedIn学习“SQL基本培训”课程的特殊情况,我已经想好了通过运行(F9)“Begin Transaction”、“...Transaction Contents...”来修复它。和“End Transaction”语句分开,而不是所有语句同时执行。
所以,
1.首先选择“Begin Transaction;”,然后按f9运行它。
1.然后选择事务的内容(我认为您也可以包括“end Transaction;”部分)并运行它。

相关问题