我试图了解在一个查询中从表中获取特定行的最佳方法是什么。
假设我的表格列是:
姓名,年龄,国家
假设它有1000行。然后,我有一个代表行的索引数组:
[2,10,20,34,50,120,400,410,444,810]
如何获得相应的名称?因此,[第2行的名称,第10行的名称,....]
我在网上看到了这样的东西:
SELECT * FROM `posts` WHERE `id` IN (5,6,7,8,9,10)
但是,我没有id列...在拉出类似的东西之前我需要操纵表或数据库吗?
答案 0 :(得分:1)
以下方法(某种程度上)可以工作:-
SELECT * FROM `posts` WHERE rowid IN (5,6,7,8,9,10)
这是因为通常无处不在的 id 列通常是特殊(通常隐藏)的 rowid 列的别名。
这是一个未使用 WITHOUT ROWID 定义的表,将具有带有自动生成的ID的 rowid 列(除非通过以下方式指定或隐式指定了rowid)是 rowid 列的别名。
行列的别名是通过指定 ?? INTEGER PRIMARY KEY
定义的(其中??表示有效的列名(通常为ID))。关键字 AUTOINCREMENT
可以补充INTEGER PRIMARY KEY
,并添加一个约束条件,使生成的 id (即 rowid )< strong>必须增加,可以使用没有未使用的较低数字的(仅当最高ID为9223372036854775807时才相关)。使用 AUTOINCREMENT
,如果达到此最高ID,则将遇到SQLITE_FULL异常(不尝试首先选择一个较低的空闲数字)。
以上是SQLite Autoincrement的一些要点的总结。
请考虑以下内容(最后两个SELECT查询等同于答案):-
DROP TABLE IF EXISTS rowid_demo1;
DROP TABLE IF EXISTS rowid_demo2;
CREATE TABLE IF NOT EXISTS rowid_demo1 (name TEXT, age INTEGER, country TEXT);
CREATE TABLE IF NOT EXISTS rowid_demo2 (id_column INTEGER PRIMARY KEY, name TEXT, age INTEGER, country TEXT);
INSERT INTO rowid_demo1 (name,age,country) VALUES
('Fred',22,'England'),('Mary',18,'Scotland'),('Heather',19,'Wales');
INSERT INTO rowid_demo2 (name,age,country) VALUES
('Fred',22,'England'),('Mary',18,'Scotland'),('Heather',19,'Wales');
SELECT *,rowid as rowid_column FROM rowid_demo1;
SELECT *,rowid as rowid_column FROM rowid_demo2;
INSERT INTO rowid_demo1 (rowid,name,age,country) VALUES
(100,'George',21,'France');
INSERT INTO rowid_demo2 (rowid,name,age,country) VALUES
(100,'George',21,'France');
SELECT *,rowid as rowid_column FROM rowid_demo1;
SELECT *,rowid as rowid_column FROM rowid_demo2;
-- Ridiculous to do the following but ??????
INSERT INTO rowid_demo2 (rowid,id_column,name,age,country) VALUES
(500,501,'Beth',20,'Spain');
SELECT *,rowid as rowid_column FROM rowid_demo1;
SELECT *,rowid as rowid_column FROM rowid_demo2;
SELECT *,rowid AS rowid_column FROM rowid_demo1 WHERE rowid IN(2,3,100);
SELECT *,rowid AS rowid_column FROM rowid_demo2 WHERE rowid IN(2,3,100,501);
此:-