即,以下两个SQL语句在SQLite中是否等效?
CREATE TABLE posts (
id INTEGER PRIMARY KEY
);
CREATE TABLE posts (
id INTEGER PRIMARY KEY ASC
);
答案 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;
查询SELECT * FROM sqlite_master WHERE name LIKE '%posts%';
的结果是:-
您会看到 posts3 与创建了 sqlite_autoindex_posts3_1 索引的
有很大不同其他人没有创建特定的索引,因为id列是 rowid 列
的别名rowid表的数据存储为B-Tree结构,其中包含 使用rowid值作为键,每个表行都有一个条目。这个 表示按rowid检索或排序记录很快。正在搜寻 具有特定rowid的记录,或具有rowid的所有记录 在指定范围内的速度大约是类似搜索速度的两倍 通过指定其他任何PRIMARY KEY或索引值来完成。
ROWIDs and the INTEGER PRIMARY KEY
查询SELECT * FROM posts1;
的结果是:-
查询SELECT * FROM posts2;
根据以下信息确认初始的 YES 答案:-
查询SELECT * FROM posts3;
可能会有些混乱,但是显示id INTEGER PRIMARY KEY DESC
不会导致 rowid 的别名,并且在没有值或null的情况下被插入列中时,该值为null而不是自动生成的值。没有UNIQUE约束冲突(因为null被认为是不同的值)。
即使使用了SELECT * FROM posts4;
,查询id INTEGER, PRIMARY KEY (id DESC)
也会产生与1和2相同的结果。确认即使通过列定义应用了 DESC ,排序顺序仍默认为 ASC (除非使用了ORDER BY子句)。
答案 1 :(得分:1)
请参阅https://www.sqlite.org/lang_createtable.html#rowid和https://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是默认的。