我刚刚遇到过各种视图,我认为它们是一个很好的主意,但是我遇到了一个问题,因为我无法找到刚刚插入到拦截触发器中的行的ID。
我无法从Google找到很多信息,所以这里有一个例子。每次插入一行时,即使插入成功,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
答案 0 :(得分:0)
如果您以前没有做过任何插入操作,那么从该插入中获得0是正常的预期行为。
如果在触发器内发生INSERT,则只要触发器正在运行,此例程将返回插入行的rowid。触发器程序结束后,此例程返回的值将还原为触发触发器之前的值。