标签: sqlite

为什么 INSERT AFTER Trigger 不添加所有结果?

我正在为 db-class.org 编写练习,我们必须编写一个触发器,使新学生自动像同年级的其他人一样被命名为“友好”。也就是说,在触发器运行后,对于与“Friendly”同年级的所有其他高中生 A,我们应该在 Likes 表中包含 ('Friendly', A)。

这是在以下数据集的sqlite 中完成的。现在我的触发器起作用了,但它只添加了一个“友好”喜欢的人,而不是所有人(具有相同等级的人)。

这是我的触发器:

CREATE Trigger Q1
After Insert on Highschooler
For Each Row
When New.Name = 'Friendly'
Begin
    INSERT Into Likes Values (New.ID, (
    SELECT Highschooler.ID FROM Highschooler
    WHERE Highschooler.Grade = New.Grade));
End;
Run Code Online (Sandbox Code Playgroud)

我怀疑我的 INSERT 查询有问题,因为孤立地 SELECT 返回所有 ID。那么我如何确保它插入所有具有匹配成绩的 ID?

sqlite trigger

5
推荐指数
1
解决办法
3419
查看次数

Postgres uuid:用作主键,或作为 SERIAL 的补充 - 对于断开连接的应用程序 -

对于带有 postgres 9 的新 SASS 应用程序,它将支持断开连接的客户端。

客户端不会使用常规 ID,而只会使用 UUID。客户端将在 iOS、html5/python 上运行,稍后可能还会在其他平台上运行。客户端数据库将是sqlite。

每个客户都将使用自己的模式,因此希望不会存在太大的表,但仍然因为这是用于发票和财务内容的,所以会生成大量数据,并且因为云托管成本与 CPU/RAM 超额费用相关从一开始就拥有最佳性能是有意义的(加上更快的响应时间对最终用户来说是有好处的)。

因此,我需要在客户端中使用 UUID 支持创建新记录。现在,我正在争论是否仅将 UUID 用于同步部分,并使用常规 ID 用于 JOINS 和主键。

但是,我也觉得这是重复,如果我要存储 uuid 为什么不在服务器中根本不删除 int 键,但担心这是否会在以后给我带来性能问题以及我需要使用哪种索引类型(btree 将是够好了?)

postgresql sqlite

5
推荐指数
1
解决办法
6153
查看次数

SQLite3 简单数据库设计题

我是一个 ruby​​ 爱好者,完全没有与数据库相关的经验。我正在编写一个应用程序,该应用程序将在 SQLite3 数据库中收集和备份推文和博客文章(通过 rss 提要)。

第一个版本只支持备份特定用户的推文,因为我想为我的 twitter 帐户创建备份。所以 SQLite3 模式很简单:1 个数据库,每个用户 1 个表。

现在我想为以下内容添加备份支持:基于位置的推文(即来自德国的推文)、基于用户名的推文和基于主题标签的推文以及支持 RSS 提要。

由于 SQLite3 不支持任何类型的子表,并且我想创建一个在我开始测试时不需要更改的模式,我想就如何处理这个问题发表意见。

我在网上阅读了很多关于 SQL 数据库设计的文章或文章,还找到了几本书。还没有购买任何东西,我只是在考虑阅读有关 db 设计的一些基础知识,因为我不需要一本广泛的书,只是我正在评估的介绍。我不确定这些文章是否让我更加困惑。

我想出的 db 模式是一个 INDEX 表,其中将保存用户的信息,然后每个用户的每个选项都有一个表,例如:

?  lib git:(dev) ? cat sqlite_scheme.txt 
SQLite3 Table Scheme

MRParent
--------
db_key
table_id
twitter_id
twitter_option {what and how}
feed_url
short_description

MRChild-id-tweet-usr
---------
db_key
tweet_id {from MRParent}
table_id
tweet_date
tweet_location
tweet_text

MRChild-id-tweet-location
-------------------------
db_key
table_id {from MRParent}
tweet_id
tweet_date
tweet_location
tweet_text

MRChild-id-tweet-hashtag
------------------------
db_key
table_id {from MRParent}
tweet_hashtag
tweet_id
tweet_date …
Run Code Online (Sandbox Code Playgroud)

schema sqlite database-design

5
推荐指数
1
解决办法
1459
查看次数

有什么类似于 MySQLWorkbench for MySQL 的好 sqlite 工作台工具吗?

有什么类似于 MySQLWorkbench for MySQL 的好 sqlite 工作台工具吗?我习惯使用 MySQLWorkbench 来处理 MySQL 数据库。现在我有一些 sqlite 数据库可以使用,并且想找到一个类似的工具。

sqlite tools

5
推荐指数
1
解决办法
2万
查看次数

Spatialite:使用虚拟空间索引来计算距离

我目前正在学习使用空间访问方法进行查询优化。我正在阅读空间食谱中的示例并被困在这里 http://www.gaia-gis.it/gaia-sins/spatialite-cookbook/html/pp-adjacent.html

根据教程,为了找到距离小于 1 公里的人口对,我们必须执行此查询

    SELECT pp1.name AS "PopulatedPlace #1",
      GeodesicLength(MakeLine(pp1.geometry, pp2.geometry)) AS "Distance (meters)",
      pp2.name AS "PopulatedPlace #2"
    FROM populated_places AS pp1,
    populated_places AS pp2
    WHERE GeodesicLength(
      MakeLine(pp1.geometry, pp2.geometry)) < 1000.0
      AND pp1.id <> pp2.id
    AND pp2.ROWID IN (
      SELECT pkid
      FROM idx_populated_places_geometry
      WHERE pkid MATCH RTreeDistWithin(
       ST_X(pp1.geometry),
       ST_Y(pp1.geometry), 0.02))
    ORDER BY 2;
Run Code Online (Sandbox Code Playgroud)

由于不再使用地理回调函数 RTree*** 而引发错误。我检查了这个更新,这已被虚拟空间索引的使用所取代。我们必须使用表单的子查询

    SELECT ROWID
    FROM SpatialIndex
    WHERE
       f_table_name = <table_name>
       AND search_frame = <some_geometry>
Run Code Online (Sandbox Code Playgroud)

所以我测试了这个

    SELECT pp1.name AS "PopulatedPlace #1",
      GeodesicLength(MakeLine(pp1.geometry, pp2.geometry)) AS "Distance (meters)", …
Run Code Online (Sandbox Code Playgroud)

sqlite subquery spatial

5
推荐指数
1
解决办法
354
查看次数

SQLite3:删除重复项

鉴于下表

CREATE TABLE `sms` (
    `_id`   INTEGER,
    `thread_id` INTEGER,
    `address`   TEXT,
    `person`    INTEGER,
    `date`  INTEGER,
    `protocol`  INTEGER,
    `read`  INTEGER DEFAULT 0,
    `status`    INTEGER DEFAULT -1,
    `type`  INTEGER,
    `reply_path_present`    INTEGER,
    `subject`   TEXT,
    `body`  TEXT,
    `service_center`    TEXT,
    PRIMARY KEY(_id)
);
Run Code Online (Sandbox Code Playgroud)

我想删除addressbody相同的所有行。换句话说,根据address和消除重复body,只留下第一次出现。

sqlite duplication

5
推荐指数
1
解决办法
2万
查看次数

Sqlite使用其他表中的检查列创建表

我有两个表:

位置

CREATE TABLE IF NOT EXISTS position(
  id_position INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL,
  min REAL NOT NULL CHECK (min > 0),
  max REAL CHECK (max > 0),
);
Run Code Online (Sandbox Code Playgroud)

最低,最高工资链接

员工

CREATE TABLE IF NOT EXISTS employee (
  id_employee INTEGER PRIMARY KEY AUTOINCREMENT,
  id_position INTEGER NOT NULL,
  name TEXT NOT NULL,
  last_name TEXT NOT NULL,
  data_of_birth TEXT NOT NULL CHECK (DATE(data_of_birth) IS NOT NULL AND data_of_birth < DATE('now','localtime')),
  salary REAL NOT NULL CHECK (salary >= position.min AND …
Run Code Online (Sandbox Code Playgroud)

sqlite table check-constraints

5
推荐指数
1
解决办法
1949
查看次数

需要解释多对多关系的 SELECT 查询

我有两个通过另一个(多对多)相关的表

这是模式摘录:

CREATE TABLE user (
    user_id  INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    email    TEXT    NOT NULL UNIQUE
);

CREATE TABLE alias (
    alias_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    address  TEXT    NOT NULL UNIQUE
);

CREATE TABLE alias_member (
    alias_id INTEGER NOT NULL,
    user_id  INTEGER NOT NULL,
    PRIMARY KEY(alias_id, user_id),
    FOREIGN KEY(alias_id) REFERENCES alias(alias_id) ON DELETE CASCADE,
    FOREIGN KEY(user_id)  REFERENCES user(user_id)   ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)

我有一个满足我需求的查询:

SELECT email
FROM
    user,
    alias,
    alias_member
WHERE 
    user.user_id = alias_member.user_id
    AND alias.alias_id = …
Run Code Online (Sandbox Code Playgroud)

sqlite

5
推荐指数
1
解决办法
2万
查看次数

当列存在时没有这样的列

我的trackedinfo数据库中有一个表 ( ),它具有以下列(通过运行获得的列PRAGMA table_info(trackedinfo);

表格的列

问题是,即使该列sendok存在,当对具有该字段的数据库运行查询时,它也会引发错误。

示例查询:

SELECT * FROM trackedinfo WHERE sendok IS NULL;
SELECT sendok FROM trackedinfo;
Run Code Online (Sandbox Code Playgroud)

错误:

SQLITE_ERROR: SQL error or missing database (no such column: sendok)
Run Code Online (Sandbox Code Playgroud)

错误

但是,如果我运行一个选择所有字段的查询,它会给我带来以下信息sendok

在此处输入图片说明

这是CREATE数据库的命令:

CREATE TABLE trackedinfo
(
    id INTEGER PRIMARY KEY,
    date_time_start TEXT,
    date_time_end TEXT,
    tracked_name TEXT,
    tracked_origin TEXT,
    tracked_maker TEXT,
    tracked_version TEXT,
    tracked_type TEXT,
    sendok TEXT,
    tracked_id TEXT
);
Run Code Online (Sandbox Code Playgroud)

它也发生在列 tracked_id

我通过执行获得的信息 .schema trackedinfo

CREATE TABLE IF NOT EXISTS "trackedinfo" ("id" …
Run Code Online (Sandbox Code Playgroud)

sqlite errors

5
推荐指数
1
解决办法
6万
查看次数

离线优先数据库设计如何工作?

我想制作一个离线优先的待办事项应用程序,它可以在移动应用程序(SQLite)和网络应用程序(PostgreSQL)上运行。该应用程序将具有以下商业模式:

用户:

  • ID
  • 姓名
  • 创建日期时间

去做:

  • ID
  • 用户身份
  • 标题
  • 完毕
  • 创建日期时间
  • 更新日期时间

创建新用户:

  • 只能使用网络应用程序创建新用户。

创建新的待办事项:

  • 可以使用网络应用程序创建待办事项。
  • 如果移动应用程序在线,请将待办事项发布到网络应用程序上。id如果帖子成功,请在移动应用程序中创建具有相同成功待办事项的待办事项。
  • 如果移动应用程序处于离线状态,只要网络应用程序再次上线,仍会创建新的待办事项,并将新的待办事项更新/发布到网络应用程序。

如果手机处于离线状态并且我没有任何 ID,我不确定如何创建新的待办事项。如果我为移动应用程序创建一个虚拟 ID,它可能会与其他待办事项 ID 发生冲突。或者我应该在移动应用程序中使用 UUID 作为我所有待办事项的 ID,然后将其发布到网络应用程序?其他离线优先应用程序数据库设计如何工作?

postgresql sqlite offline

5
推荐指数
1
解决办法
957
查看次数