我是数据库新手,并且有一个像这样的sqlite数据库:
CREATE TABLE IF NOT EXISTS Tiles (id INTEGER NOT NULL PRIMARY KEY, X INTEGER NOT NULL, Y INTEGER NOT NULL, Zoom INTEGER NOT NULL, Type INTEGER NOT NULL,Date TEXT)
CREATE TABLE IF NOT EXISTS TilesData (id INTEGER NOT NULL PRIMARY KEY CONSTRAINT fk_Tiles_id REFERENCES Tiles(id) ON DELETE CASCADE, Tile BLOB NULL)
如果我是第一次拨打以下插入电话:
INSERT INTO Tiles(X, Y, Zoom, Type,Date) VALUES(?, ?, ?, ?,?)
INSERT INTO TilesData(id, Tile) VALUES((SELECT last_insert_rowid()), ?)
Tiles和TilesData的ID是什么? SELECT last_insert_rowid()的功能是什么?
答案 0 :(得分:1)
我使用以下脚本在SQLFiddle(以便轻松显示结果)和本地SQLite实例(以确认SQLite(SQL.js)与本地实例的行为相同)上构建查询:
CREATE TABLE IF NOT EXISTS Tiles (id INTEGER NOT NULL PRIMARY KEY, X INTEGER NOT NULL, Y INTEGER NOT NULL, Zoom INTEGER NOT NULL, Type INTEGER NOT NULL,Date TEXT);
CREATE TABLE IF NOT EXISTS TilesData (id INTEGER NOT NULL PRIMARY KEY CONSTRAINT fk_Tiles_id REFERENCES Tiles(id) ON DELETE CASCADE, Tile BLOB NULL);
INSERT INTO Tiles(X, Y, Zoom, Type,Date) VALUES(1, 2, 3, 4, 'Date');
INSERT INTO TilesData(id, Tile) VALUES((SELECT last_insert_rowid()), 'Stuff');
select * from Tiles;
select * from TilesData;
在这两个实例中,两个表中的id
都是1
。
select last_insert_rowid()
的目的是确定最后一次成功插入的rowid是什么。在您的示例中,它返回INSERT INTO Tiles
查询(1
)中的值,然后将其分配给TilesData的id
。
我们可以demonstrate通过在第一个插入中指定id
并看到TilesData的id
也与强制ID匹配来实现{{3}}。
INSERT INTO Tiles(id, X, Y, Zoom, Type,Date) VALUES(123456, 10, 2, 3, 4, 'Date');
INSERT INTO TilesData(id, Tile) VALUES((SELECT last_insert_rowid()), 'Stuff');
在此示例中,我强制Tiles表中的id
为123456
。此值用作TilesData的id
。
select * from TilesData;
结果:
id | Tile
--------------
123456 | Stuff