Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL主键自动递增vs时间戳_Sql_Sqlite_Indexing_Timestamp_Primary Key - Fatal编程技术网

SQL主键自动递增vs时间戳

SQL主键自动递增vs时间戳,sql,sqlite,indexing,timestamp,primary-key,Sql,Sqlite,Indexing,Timestamp,Primary Key,前提: 我知道使用主键的最佳方法是根据索引将字段设置为整数(自动递增或不自动递增),但我遇到了一个特殊情况 我有一个离线工作的程序(在pc和平板电脑上),使用sqlite作为数据库。 用户可以在程序和中央服务器(如云)之间同步数据。 当用户同步数据时,服务器和viceversa上的所有本地更新字段都会更新 在这种情况下使用主键自动递增是一个糟糕的解决方案,因为如果两个用户在一个表中(在两个不同的设备上)添加一个字段,我将复制主键 然后,我添加了另一个包含用户ID的字段,因此我有一个由以下内容组成

前提:

我知道使用主键的最佳方法是根据索引将字段设置为整数(自动递增或不自动递增),但我遇到了一个特殊情况

我有一个离线工作的程序(在pc和平板电脑上),使用sqlite作为数据库。 用户可以在程序和中央服务器(如云)之间同步数据。 当用户同步数据时,服务器和viceversa上的所有本地更新字段都会更新

在这种情况下使用主键自动递增是一个糟糕的解决方案,因为如果两个用户在一个表中(在两个不同的设备上)添加一个字段,我将复制主键

然后,我添加了另一个包含用户ID的字段,因此我有一个由以下内容组成的索引:
USER\u ID
FIELD\u ID
通过这种方式,情况会发生变化,但仍然可能存在问题

1) 我不能将字段ID设置为自动增量 2) 上述问题仍然存在, 如果用户Paul有两个具有相同数据库版本(同时同步)的设备,并且在设备1中,他在表_AAA上进行了一次插入,并且在表_AAA上进行了另一次插入,但是在设备2中,我将有一个重复的索引(用户\u ID/字段\u ID)

因此,我将字段_ID转换为由yyyymmddhhmmssmm组成的varchar(17),这样用户就不可能在同一毫秒内进行两次操作

问题:


在我的情况下,有没有更好的方法来设置主键?

创建第二个唯一字段,即guid。您可以使用快速索引进行常规使用,并获得合并的唯一性。

您可能应该将其作为主键,为了更清晰,您可以添加设备id字段来区分行,尽管
UUID
应该足够了


顺便说一句,
UUID
s结果上升,也就是说,表数据碎片不应该给您带来太多麻烦。

只是想一想,您说在同一毫秒内进行两次更新“非常不可能”,但如果系统时间改变了怎么办?为什么复合主键对您不起作用?(用户id、设备id、字段id)?这不仅提供了唯一性,而且还明确地定位了数据生成的位置。无论您做什么,都可以出于任何原因随意使用时间戳,但作为唯一标识符除外。您最终会遇到冲突。从技术上讲,您可以创建两个匹配的guid。我不知道这需要多少宇宙生命;)时间戳根本不能被认为是唯一的,但是guid确实可以被认为是唯一的。