PRIMARY KEY 之后的 DESC 和 ASC 的用途是什么?

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

这有什么区别:

CREATE TABLE posts1 (
  id INTEGER PRIMARY KEY ASC
);

还有这个:

CREATE TABLE posts1 (
  id INTEGER PRIMARY KEY DESC
);

我知道

id INTEGER PRIMARY KEY DESC
不会将
id
列变成
rowid
的别名。

我对

DESC
之后的
ASC
PRIMARY KEY
的最初目的感兴趣吗?它们有什么用?

sqlite
1个回答
0
投票

主键列上 ASC 或 DESC 的目的是允许对该列进行排序,除了 INTEGER 类型之外,差异只是索引的顺序。

然而,当涉及到 INTEGER 类型的特定/特殊实例(并且它是主键中的唯一列)时,它最终会确定该列是否是 rowid 列的别名(已承认但为了兼容性而保留的错误)。

  • 据猜测,实施 rowid 索引反转可能会对 rowid 的卓越效率产生影响 (通过 rowid 访问记录是高度优化的并且非常快。).

对于其他类型(甚至隐含/派生的 INTEGER 类型(例如 INT)),当生成的 PRIMARY KEY 已被规则为 rowid 的别名时,则应用真正的目的,即索引相应地排序。

使用引用的答案/讨论,即SQLite:主键默认为 ASC 吗?

然后将其扩展为包括:-

DROP TABLE IF EXISTS posts5;
CREATE TABLE IF NOT EXISTS posts5 (
    id TEXT PRIMARY KEY ASC
);
DROP TABLE IF EXISTS posts6;
CREATE TABLE IF NOT EXISTS posts6 (
    id TEXT PRIMARY KEY DESC
);
DROP TABLE IF EXISTS posts7;
CREATE TABLE IF NOT EXISTS posts7 (
    id INT PRIMARY KEY ASC
);
DROP TABLE IF EXISTS posts8;
CREATE TABLE IF NOT EXISTS posts8 (
    id INT PRIMARY KEY DESC
);
  • 即在考虑 ASC/DESC 的订单之前,主键不会是 rowid 的别名。

然后按照以下方式加载数据:-

INSERT INTO posts5 VALUES('Z'),('A'),('M');
INSERT INTO posts6 VALUES('Z'),('A'),('M');
INSERT INTO posts7 VALUES('Z'),('A'),('M');
INSERT INTO posts8 VALUES('Z'),('A'),('M');

最后:-

SELECT * FROM posts5 GROUP BY id /* group by used to force/trick use of the PK not the b-tree/rowid index*/;
SELECT * FROM posts6 GROUP BY id /* group by used to force/trick use of the PK not the b-tree/rowid index*/;
SELECT * FROM posts7 GROUP BY id /* group by used to force/trick use of the PK not the b-tree/rowid index*/;
SELECT * FROM posts8 GROUP BY id /* group by used to force/trick use of the PK not the b-tree/rowid index*/;

那么结果是:-

  • 即它们根据 PK 而不是 rowid 排序,因此根据 ASC/DESC 以及预期用途排序。

  • 请参阅引用的答案,了解 rowid 别名时的结果。

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