什么是sqlite数据库的rowid?

时间:2015-04-03 05:54:32

标签: sqlite

我是数据库新手,并且有一个像这样的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()的功能是什么?

1 个答案:

答案 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表中的id123456。此值用作TilesData的id

select * from TilesData;

结果:

id      | Tile
--------------
123456  | Stuff