在INSTEAD OF INSERT期间获取由触发器插入的行的ID

问题描述 投票:0回答:1

我刚刚看到了一些观点,我认为它们是一个非常巧妙的想法,但是我遇到了一个问题,因为我无法找到插入拦截触发器的行的ID。

我无法从谷歌找到太多信息,所以这里有一个问题的例子。每次插入一行时,lastrowid都会返回0,即使它已成功插入。有什么方法可以从触发器返回行ID吗?

import sqlite3

connection = sqlite3.connect(':memory:')
cursor = connection.cursor()

cursor.execute("""
CREATE TABLE Test(
    row_id INTEGER PRIMARY KEY,
    val1 INTEGER DEFAULT 0,
    val2 INTEGER DEFAULT 0
)
""")

cursor.execute('CREATE View TestView AS SELECT val1, val2 FROM Test')

cursor.execute("""
CREATE TRIGGER trig INSTEAD OF INSERT ON TestView
    FOR EACH ROW
    BEGIN
        INSERT INTO Test (val1, val2) VALUES (NEW.val1, NEW.val2);
    END;
""")

insert = 'INSERT INTO TestView (val1, val2) VALUES (10, 10)'
print(cursor.execute(insert).lastrowid)
#0

insert = 'INSERT INTO TestView (val1, val2) VALUES (10, 10)'
print(cursor.execute(insert).lastrowid)
#0

insert = 'INSERT INTO TestView (val1, val2) VALUES (10, 10)'
print(cursor.execute(insert).lastrowid)
#0
python view sqlite
1个回答
0
投票

如果你没有做过任何先前的插入,从那里得到0是正常的,预期的行为。

来自the documentation

如果在触发器中发生INSERT,则只要触发器正在运行,此例程将返回插入行的rowid。触发器程序结束后,此例程返回的值将恢复为触发器触发前的值。

© www.soinside.com 2019 - 2024. All rights reserved.