这有什么区别:
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
的最初目的感兴趣吗?它们有什么用?
主键列上 ASC 或 DESC 的目的是允许对该列进行排序,除了 INTEGER 类型之外,差异只是索引的顺序。
然而,当涉及到 INTEGER 类型的特定/特殊实例(并且它是主键中的唯一列)时,它最终会确定该列是否是 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
);
然后按照以下方式加载数据:-
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 别名时的结果。