SQLite:PRIMARY KEY是否默认为ASC?

时间:2019-07-03 20:37:45

标签: sqlite

即,以下两个SQL语句在SQLite中是否等效?

CREATE TABLE posts (
  id INTEGER PRIMARY KEY
);

CREATE TABLE posts (
  id INTEGER PRIMARY KEY ASC
);

2 个答案:

答案 0 :(得分:3)

不需要指定 ASC 注意,如果要指定 DESC ,则那么它们就不相等了(请参见下面的 4 ),因为id INTEGER PRIMARY KEY DESC是该列的排除项,它是 rowid 列的别名,如下所示:-

  

上面提到的例外是,如果声明一个列   声明类型为“ INTEGER”的子句包含“ PRIMARY KEY DESC”子句,   不会成为rowid的别名,也不会归类为   整数主键。这个怪癖不是故意的。这是由于一个错误   在早期版本的SQLite中。但是修复该错误可能会导致   向后不兼容。因此,原始行为是   保留(并记录),因为极端情况下的异常行为   比兼容性中断更好。

ROWIDs and the INTEGER PRIMARY KEY

您可以使用id INTEGER, PRIMARY KEY(id, DESC),但是检索列时该顺序仍默认为ASC,因为它是rowid的别名(请参见下面的 5

也许考虑以下几点:-

DROP TABLE IF EXISTS posts1;
CREATE TABLE posts1 (
  id INTEGER PRIMARY KEY
);

DROP TABLE IF EXISTS posts2;
CREATE TABLE posts2 (
  id INTEGER PRIMARY KEY ASC
);

DROP TABLE IF EXISTS posts3;
CREATE TABLE posts3 (
  id INTEGER PRIMARY KEY DESC
);

DROP TABLE IF EXISTS posts4;
CREATE TABLE posts4 (
    id INTEGER, PRIMARY KEY (id DESC)
);

INSERT INTO posts1 VALUES(null),(null),(null);
INSERT INTO posts2 VALUES(null),(null),(null);
INSERT INTO posts3 VALUES(null),(null),(null);
INSERT INTO posts4 VALUES(null),(null),(null);

SELECT * FROM sqlite_master WHERE name LIKE '%posts%';

SELECT * FROM posts1;
SELECT * FROM posts2;
SELECT * FROM posts3;
SELECT * FROM posts4;

结果

1

查询SELECT * FROM sqlite_master WHERE name LIKE '%posts%';的结果是:-

enter image description here

您会看到 posts3 与创建了 sqlite_autoindex_posts3_1 索引的

有很大不同

其他人没有创建特定的索引,因为id列是 rowid

的别名
  

rowid表的数据存储为B-Tree结构,其中包含   使用rowid值作为键,每个表行都有一个条目。这个   表示按rowid检索或排序记录很快。正在搜寻   具有特定rowid的记录,或具有rowid的所有记录   在指定范围内的速度大约是类似搜索速度的两倍   通过指定其他任何PRIMARY KEY或索引值来完成。

ROWIDs and the INTEGER PRIMARY KEY

2

查询SELECT * FROM posts1;的结果是:-

enter image description here

3

查询SELECT * FROM posts2;根据以下信息确认初始的 YES 答案:-

enter image description here

4

查询SELECT * FROM posts3;可能会有些混乱,但是显示id INTEGER PRIMARY KEY DESC不会导致 rowid 的别名,并且在没有值或null的情况下被插入列中时,该值为null而不是自动生成的值。没有UNIQUE约束冲突(因为null被认为是不同的值)。

enter image description here

5

即使使用了SELECT * FROM posts4;,查询id INTEGER, PRIMARY KEY (id DESC)也会产生与1和2相同的结果。确认即使通过列定义应用了 DESC ,排序顺序仍默认为 ASC (除非使用了ORDER BY子句)。

  • 请注意,此特性特定于 rowid 列或其别名。

enter image description here

答案 1 :(得分:1)

请参阅https://www.sqlite.org/lang_createtable.html#rowidhttps://www.sqlite.org/lang_createindex.html以获得更完整的答案。 Shawn的链接特定于 export class MyComponent extends React.Component { componentDidMount() { this.computeStyle(this.htmlElement, this.props.height) } computeStyle(htmlElement, height) { if (htmlElement === null) return; htmlElement.style.height = height + "px"; } render() { return ( <div style={{ backgroundColor: "red" }} ref={ref => (this.htmlElement = ref)} > </div> ); } } ,它与示例代码匹配,但是在任一位置都没有明确回答更普遍的问题,但是可以通过阅读两者来推论。

在“ SQL数据约束”下,第一个链接显示

  

在大多数情况下,通过在数据库中创建唯一索引来实现UNIQUE和PRIMARY KEY约束。 (例外是WITHOUT ROWID表上的INTEGER PRIMARY KEY和PRIMARY KEY。)

CREATE INDEX页面解释说,最初忽略了排序顺序,并且所有索引都是按升序生成的。 INTEGER PRIMARY KEY顺序仅在版本3.3.0之前“可理解”。但是即使这样的描述也有些含糊,但是很明显, ASC是默认的