如何为带有“名称”和“日期”的行生成唯一 ID,以避免重复输入


How to generate a unique ID for a row with "name" and "date", to avoid duplicate entries?

我有以下情况:

我正在使用来自网站的 REST API 来获取用户最近 50 次销售的列表。对于每笔销售,它都会返回产品名称和销售时间戳(以及其他一些内容,如金额等)。

我想以增量方式向我的数据库添加新销售,但我不知道如何避免重复输入,因为我没有得到任何销售 ID 或类似的东西。我猜我必须结合时间戳和产品名称才能为每笔销售生成一个唯一的哈希值,并将其用作表中的主键。

这是正确的方法吗,我将如何在代码中实现它?我正在使用PHP。

干杯

你没有太多选择。您可以使用这两个字段在表上创建一个唯一索引以避免重复性或生成哈希来标识它们(例如sha1($name.$timestamp))。

Edit

您的

问题是,您正在删除由您无法控制的服务发送给您的冗余数据。(我在之前的回答中误解了这一点)。

似乎您有每笔销售的产品和时间戳。 您是否还有其他识别信息,例如商店或收银机号?

这五十个

项目总是最近的五十个项目吗? 它们是否在 REST 请求中以任何有用的顺序呈现 - 例如最旧的优先?

如果你得到,比如说,三个新行和47个重复项,重复项是否与以前收到的项目相同 - 相同的时间,产品,数量,其他东西?

如果是这样的话,我会做以下几点。

使用这些列和索引创建表。

    id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT 
    inserttime DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    repeats INT NOT NULL DEFAULT 0
    saletime   DATETIME
    item       VARCHAR(nn)
    amount     int
    description  (etc)
    PRIMARY KEY (id)
    UNIQUE INDEX (saletime,item, amount, description)

然后,当您从 REST 接口接收记录时,请按如下方式插入它们。

INSERT INTO table (saletime, item, amount, description)
            VALUES (?,?,?,?)
   ON DUPLICATE KEY UPDATE repeats=repeats+1

这将使用 MySQL 的唯一密钥设置来删除重复项。同时,它会让您知道您获得重复数据的频率,以及您最近获得数据的时间。

您始终可以了解最近一次销售发生的时间

SELECT MAX(saletime) FROM table

您的复合索引将有助于满足该查询。

请勿为此目的使用包含多个列的 SHA 样式哈希。这是一个臭名昭著的MySQL反模式。这是因为MySQL的索引在其组织中是BTREE(有序的),而哈希是无序的。