我有一个表user_interactions,有4列:

 user_1
 user_2
 type
 timestamp

主键是(user_1,user_2,type)

所以我做的是:

drop primary key ...  
add primary key (user_2,user_1,type)...

瞧...

问题是数据库在服务器上是实时的.

因此,在我更新主键之前,许多重复项已经悄悄进入,它们正在不断地进入.

怎么办?

我现在想做的是删除重复项,并保留最新的timestamp个(表中的一列).

然后以某种方式再次更新主键.

推荐答案

下次,使用一个"alter table"语句来更新主键.

alter table xx drop primary key, add primary key(k1, k2, k3);

要解决问题:

create table fixit (user_2, user_1, type, timestamp, n, primary key( user_2, user_1, type) );
lock table fixit write, user_interactions u write, user_interactions write;

insert into fixit 
select user_2, user_1, type, max(timestamp), count(*) n from user_interactions u 
group by user_2, user_1, type
having n > 1;

delete u from user_interactions u, fixit 
where fixit.user_2 = u.user_2 
  and fixit.user_1 = u.user_1 
  and fixit.type = u.type 
  and fixit.timestamp != u.timestamp;

alter table user_interactions add primary key (user_2, user_1, type );

unlock tables;

锁应该会阻止在您执行此操作时进一步更新.这需要多长时间显然取决于你桌子的大小.

主要问题是,如果您有一些具有相同时间戳的副本.

Mysql相关问答推荐

try 恢复数据库时,如何正确解决行大小太大消息?

完全相同的A B表达在SQL中的不同上下文中意外返回不同的结果

try 使用TypeORM创建新表时出现SQL语法错误

如何计算超过特定数字的所有不同ID组,然后返回这些ID?

MySQL:返回所有条件(但不满足其他条件)为真的所有结果

「已解决」MySQL 连接在 vb6 上出现运行时错误 -2147467259 (80004005),但在 VBA Excel 上工作

完全匹配 IN 子句中的所有值

如何优化使用多个 LEFT JOIN 和 GROUP BY 子句的慢速 MySQL 查询?

如何使用减号运算符编写 sql 查询以返回缺少相应值的行?

MYSQL:如何根据之前的相关记录获取记录

MYSQL除以零警告,奇怪的行为

创建表时我的 SQL 语句有什么问题

如何在任何连续范围内获得最大值

什么是 PyMySQL,它与 MySQLdb 有何不同?它会影响 Django 部署吗?

如何在mysql中连接整数(整数和整数)和varchar(nvarchar和varchar)等数据类型?

安装 mysql-python (Windows)

Amazon RDS Aurora 与 RDS MySQL 与 EC2 上的 MySQL?

警告:mysqli_connect(): (HY000/1045): Access denied for user 'username'@'localhost' (using password: YES)

Sequelize:销毁/删除表中的所有记录

数据截断:第 1 行的logo列数据太长