如何为 "name" 和 "date" 的行生成唯一 ID 以避免重复条目?

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

我有以下情况:

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

我想逐步向我的数据库中添加新的销售,但我不知道如何避免重复条目,因为我没有获得任何销售 ID 或类似信息。我猜我必须结合时间戳和产品名称来为每次销售生成一个唯一的哈希值,并将其用作我的 table.

中的主键

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

干杯

您没有太多选择。您可以使用这两个字段在 table 上创建一个 UNIQUE INDEX 以避免口是心非,或者生成一个散列来识别它们(例如 sha1($name.$timestamp))。

编辑

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

您似乎有每次销售的产品和时间戳。您是否还有任何其他识别信息,例如商店或注册号?

50 项总是最新的 50 项吗?它们是否以任何有用的顺序出现在 REST 请求中——例如从大到大?

如果你得到,比方说,三个新行和 47 个重复项,这些重复项是否与之前收到的项目相同——相同的时间、产品、数量和其他内容?

如果是这样的话,我会做以下事情。

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

    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(有序的),而哈希是无序的。