首页 > 解决方案 > SQLite - 两个 PK,一个 FK

问题描述

我正在设计一个存储有关学科信息的表 - 它允许用户添加记录,但我还需要能够自己添加记录(这将在更新时向用户显示)。

问题当然是自动递增的 ID - 如果我启动列出 9 的应用程序并在更新中添加第 10 个学科,在我这边它将显示 ID 为 10,但他们可能已经创建了 20。很明显,基本的东西,但是如果我改为将数据拆分为具有相同架构的单独表,我会遇到另一个表(列出主题)需要单个 PK 列表的问题,因为它是 Discpline FK。

因此它们不能是两个单独的自动递增 ID 列表,因为 FK 不能有重复值,但它们也不能是同一列以避免重复 ID。我唯一想到的是将数据保存在一个表中,在数据库级别和应用程序代码中删除自动增量,以我知道的特定数字开始自动增量(+1 到最后一个数字)不会接近用户添加的记录。但这似乎肮脏且效率低下,我知道在数据库级别有一种更简单的方法,我只是没有想到。

感谢您的帮助,保罗

编辑:我可以看到我不够清楚,所以对任何混淆表示歉意。我目前有两个表,但这也将适用于未来的表。

我了解 tbl_disciplines 可以包含我自己和用户的条目,但是由于我对 SQLite 的理解以及我将添加更多表的知识,我希望将它们作为两个单独的表,其中许多表包含数十个字段和 FK。当将来的表可能需要在更新时添加 100 多条新记录时,我不想在 onUpgrade 中手动写出每条新记录。将使用数据库的应用程序旨在使向数据库添加更高效、更简单的过程。

如果它们是单独的表,我知道 onUpgrade,我可以简单地删除并替换我在用户端的旧记录表,并用我自上次更新以来使用应用程序添加的所有记录的新表,留下一秒钟用户记录表保持不变。据我了解,如果我将我的记录和用户的记录保存在同一个表中,我需要手动将我的所有更新记录逐个记录添加到 onUpgrade 区域的同一个现有表中,这样我就不会删除他们的数据。进一步的意思是,我不能将应用程序用作添加我自己的记录的前端,因为我不能在更新时用我的 tbl_disciplines 替换他们的 tbl_disciplines。

此外,如果我需要编辑关于我添加的一条记录的内容,我无法通过它的 ID 查询记录,因为它对于每个用户来说都是不同的。

标签: sqlsqlite

解决方案


我不清楚你认为问题是什么。

如果您使用表中定义的自增字段,则不会添加具有相同 ID 的两条记录。它们将保证在每个 INSERT 上都是唯一的。您没有在 INSERT 语句中指定值,而是让 SQLite 为您决定值并在 INSERT 语句执行后将其读回。

在您引用的示例中,如果用户已经添加了足够多的记录以使内部“计数器”达到 20,则您的新记录将为自动增量列分配 21,并且用户添加的下一条记录将是 22。如只要你把它留给数据库,这是有保证的。无需担心竞争条件。


推荐阅读