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

标签 php mysql sql

我遇到了这种情况,并且正在尝试找出如何停止将重复数据插入数据库。

我有表log并包含行:

device id , time (this is not the time insert but its the time the logs occur) , content

每个用户都可以通过其设备 ID 提交数据示例

123ABC , 2013-11-27 01:19:37 , sample text

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

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

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

我怎样才能做到这一点?

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

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

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

最佳答案

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

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

关于php - Mysql主键和唯一键(防止重复数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20580963/

相关文章:

php - 组合相似条目的 sum(),并包含 WHERE 子句 SQL

mysql - 无法连接到mysql服务器数据库

sql - 如何选择行和附近的行

带有 vi 键绑定(bind)的 PHP IDE

php - 更改 Magento 服务器和 MySQL 错误

php - 使用mysql插入数据时获取ID

mysql - 带有 NULL 的 SQL CASE 语句

php - 从 SQL 循环遍历(并显示)多个表行

php - 查询多个条件

javascript - 将一个值指向另一个页面 jquery?