Mysql初始密钥和唯一密钥(防止重复数据)

问题描述:

我有这种情况,我试图弄清楚如何停止向db中插入重复数据。Mysql初始密钥和唯一密钥(防止重复数据)

我有表log,包括行:

设备ID,时间(这不是一次插入,但其发生的日志的时间),内容

每个用户都可以从提交与数据例如其设备ID

123ABC,2013年11月27日1时19分37秒,样品文本

每个用户可以使用xml协议从设备提交多达500个日志。 因此,从控制面板页面中,我可以选择用户(从此设备ID)并查看他们提交的日志的总数(不同的设备ID,时间),因此我只能看到它们的唯一日志,例如400个唯一日志。 但是在后端mysql中他们有多达2000条记录日志,并且它们都从400条独特的日志中复制了5次。

  • 我不能让设备ID为唯一的,因为1设备可以提交多次,它会停止插入数据,因为每次可以是相同的设备ID。

  • 我无法组合唯一(设备ID和时间)。我认为这会工作,但数据不会插入;它拒绝我的查询。每个数据都有唯一的时间,内容但没有设备ID ...

我该如何做这项工作?

如果我希望每个用户继续提交数据日志,但不是重复的,并且只有来自同一设备ID的唯一数据日志。

如果我仅选择时间和内容作为唯一索引。如果多个设备提交相同的日志时间并且内容相同,它有时会失败...

如何使其对每个设备ID唯一而不是其他设备ID唯一。

+0

和你在你的代码中有什么?在将代码插入数据库之前,应该防止代码中出现重复项。您可以在该数据库表中添加/拥有用户标识吗? – Hardy

+0

我做过了,但每个用户都有一个重置按钮,每次点击它时,都会从开始一直重新提交日志。重置按钮就像重置时间设置,最近6个月回来,因此它将再次刷新最近6个月的所有日志。另外,为了防止日志丢失,我们的设备上的代码每次在互联网连接上ping或超时都会重新提交数据,所以这可能会重复插入。我无法弄清楚这一点。看起来像是出于选择 –

+0

我认为问题在于这个要求对你来说并不清楚。 在这种情况下,您无法清楚实施。你能用简单的话来解释一下什么是独特的吗? –

我看不出为什么两列上的常规复合唯一索引不起作用;

CREATE TABLE logs (
    log_id INT AUTO_INCREMENT PRIMARY KEY, 
    device_id VARCHAR(32), 
    time  DATETIME, 
    content VARCHAR(32) 
); 

CREATE UNIQUE INDEX uq_logs ON logs (device_id, time); 

An SQLfiddle to test with

-- First insert 
INSERT INTO logs (device_id, time, content) VALUES 
    ('123ABC', '2013-11-27 01:19:37', 'sample text'); 

-- New time, ok  
INSERT INTO logs (device_id, time, content) VALUES 
    ('123ABC', '2013-11-27 01:19:47', 'sample text'); 

-- Duplicate of #1, fails 
INSERT INTO logs (device_id, time, content) VALUES 
    ('123ABC', '2013-11-27 01:19:37', 'sample text'); 
+0

我知道这个要求表明他想要阻止dups。但是,为了表现得像日志,你不应该这样做。另外,独特的(任何)指数表现命中是不必要的。但赞誉为自动增量代理键。最后一件事,您可能需要注意发送日志的设备的时区。 –

尝试这样的:

  • 创建表的字段batch_iddevice_id
  • 数据创建用户submittes MD5哈希(整个XML)
  • 添加记录创建的表与MD5哈希和设备ID

然后你可以检查是否内容是alre ady之前通过检查内容哈希与数据库哈希来提交。

+0

我没有权限编辑客户端上的代码,但仅限于数据库。是否有解决方案,而不是有选择地创建MD5上的列?然后创建该哈希的唯一索引? –

+0

不,你应该有权访问插入数据的php代码,如果你想让它像你所描述的那样工作的话。 – Hardy