Mysql主键和唯一键(防止重复数据)

时间:2013-12-14 07:51:14

标签: php mysql sql

我有这种情况,并试图找出如何停止将重复数据插入数据库。

我有表log并包含行:

  

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

每个用户都可以使用数据示例

从设备ID提交
  

123ABC,2013-11-27 01:19:37,示例文本

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

  • 我无法将设备ID设置为唯一,因为1个设备可以多次提交,并且会停止插入数据,因为每次都可以是相同的设备ID。

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

我该如何使这项工作?

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

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

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

2 个答案:

答案 0 :(得分:1)

我无法理解为什么两列上的常规复合唯一索引都不起作用;

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');

答案 1 :(得分:1)

尝试这样:

  • 使用字段batch_iddevice_id
  • 创建表格
  • 从数据用户提交(整个xml)创建MD5哈希
  • 使用该MD5哈希和设备ID
  • 将记录添加到已创建的表中

然后您可以通过检查数据库哈希值的内容哈希来检查内容是否已经提交。