如果我有多个数据库读取器,它们基本上是以“读取”模式打开数据库文件的 Sqlite 实例,那么对于以“创建”模式打开数据库的单个写入器来说,在所有读取器关闭数据库之前无法释放事务,这正常吗?
我试图弄清楚这是 sqlite 的正常行为,还是我正在使用的特定 sqlite 库的错误/限制。
我不明白为什么作者需要等待读者停止使用数据库文件,这对我来说没有意义,因为读者无法更改数据
如果我有多个数据库读取器,它们基本上是以“读取”模式打开数据库文件的 Sqlite 实例,那么对于以“创建”模式打开数据库的单个写入器来说,在所有读取器关闭数据库之前无法释放事务,这正常吗?
我试图弄清楚这是 sqlite 的正常行为,还是我正在使用的特定 sqlite 库的错误/限制。
我不明白为什么作者需要等待读者停止使用数据库文件,这对我来说没有意义,因为读者无法更改数据
我相信这是一个非常简单的查询,但由于某种原因它在 Postgres 中不起作用(它在其他数据库中起作用)
这就是 db schema kooks 的样子:
tableA(
id integer,
...
)
tableB(
id integer
tableA_id integer -- foreign key to tableA
...
)
我想为 tableB 选择记录,与 tableA 连接,然后按 tableA_id 分组:
SELECT * from tableB b INNER JOIN tableA ON b.tableA_id = tableA.id
GROUP BY tableA_id
LIMIT 20
除了 Postgres,它在任何地方都可以正常工作,它会抛出臭名昭著的“id 必须出现在 group by 中或用于聚合函数”错误。但是如果我把 b.id 放进去group by
,我就不会删除重复的记录......
我有一个 DATETIME 键,我在其上对结果进行排序,查询运行速度很慢。如果我将其更改为 TIMESTAMP 会运行得更快吗?
因为我注意到按编号键排序几乎是立即完成的。
CREATE TABLE relations (
object_id BIGINT(20) NOT NULL PRIMARY KEY,
object_term BIGINT(20) NOT NULL,
UNIQUE KEY link(object_id, object_term),
CONSTRAINT fk_term FOREIGN KEY(object_term)
REFERENCES terms(id) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT fk_object FOREIGN KEY(object_id)
REFERENCES objects(id) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
我有一种感觉,我索引了object_id
3 次和object_term
2 次。我对吗?
如果是,我该如何解决这个问题并仍然保持约束和强制(object_id, object_term)
是唯一的?
好的,第二次尝试:
CREATE TABLE relations (
object_id BIGINT(20) NOT NULL,
object_term BIGINT(20) NOT NULL,
PRIMARY KEY link(object_id, object_term),
CONSTRAINT fk_term FOREIGN KEY(object_term)
REFERENCES terms(id) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT fk_object FOREIGN KEY(object_id)
REFERENCES objects(id) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
这是否更好?