如果您有一段时间没有使用SQLite,那么去年左右有一些很棒的新功能。
- 严格的表
- pragma table_list
- 正确和完整的外部加入
- 内置JSON支持
有关下面的每一个的更多信息。
严格的桌子
SQLite最不寻常的功能之一是它不在乎哪些数据进入列。尽管您可以为列指定类型,但实际上,这实际上是一个建议,因为可以将其他类型的数据放入列中。这种行为与大多数其他关系数据库不同,有时可能是混乱的根源。
现在,您可以使用严格的关键字来创建表格,以强迫它们需要列类型,并在将数据放入它们时始终检查列类型。
您仍然仅限于int,整数,真实,文本和斑点。这意味着仍然没有像您在其他数据库中发现的日期或日期类型。而是使用YYYY-MM-DD格式的文本。
但是,添加了任何类型,从本质上允许您清楚地说明该列可以包含任何东西。这使您可以在严格的表格中混合特定类型和通用类型的混合物。
请注意,严格的关键字在创建表命令的末尾:
CREATE TABLE Team (ID INTEGER, Name TEXT, Coach TEXT, City TEXT, PRIMARY KEY(ID)) STRICT;
SQLite docs有有关新的严格表功能的更多信息。
pragma table_list
以前,如果您想使用SQL获取表格列表,则必须直接查询SQLITE_MASTER表。
现在有一个简单的布拉格可以做同样的事情:
PRAGMA table_list
它返回表格的列表和有关表的其他一些详细信息(可能会随着时间的推移而改变according to the SQLite docs)。
右外外连接
加入表是SQL的常见任务。最常见的联接类型是内部联接,其中两个表中仅包含两个表的行。其他不太常见的连接类型包括左外,右外和全外部(有时在参考这些类型的连接时省略了外部)。
sqlite很长一段时间以来一直支持左外连接,但缺少对右外部和全外部的支持。但是现在他们在这里,使您更复杂的查询更好地与“大名数据库”兼容。
在W3 schools上了解有关这些类型的连接的更多信息。
JSON支持
我保存了最后一个大的:您的SQL数据库现在可以在列中使用JSON数据。
这是一个示例表,可与播放器列中存储的一些JSON数据一起使用:
CREATE TABLE team(id INTEGER PRIMARY KEY, Name TEXT, players TEXT);
INSERT INTO TEAM VALUES (NULL, 'Seagulls', '[ {"Name":"Bob","position":"1B"}, {"Name":"Tom","position":"2B"} ]')
INSERT INTO TEAM VALUES (NULL, 'Pigeons', '[ {"Name":"Bill","position":"1B"}, {"Name":"Tim","position":"2B"} ]')
INSERT INTO TEAM VALUES (NULL, 'Crows', '[ {"Name":"Betty","position":"1B"}, {"Name":"Tina","position":"2B"} ]')
让您说您想获得每个团队的第一个球员。如果没有SQLite JSON支持,您将不得不提取JSON列数据并分别解析。但是现在您可以使用此SQL这样做:
SELECT players -> 0 FROM team
上面的SQL说:对于每一行,从玩家中的JSON数据获取第一个数组元素。
这就是您将如何列出所有球队中的所有球员:
SELECT team.Name, json_each.value -> 'Name' FROM team, json_each(team.players)
,如果您想在没有报价的情况下获取实际值,则可以使用 - >>操作员(还可以重命名结果):
SELECT team.Name, json_each.value ->> 'Name' As PlayerName FROM team, json_each(team.players)
sqlite json支持可以做很多事情,您可以在SQLite JSON doc page上阅读。