向MySQL数据库添加唯一约束,其中包含7500条非唯一记录

向MySQL数据库添加唯一约束,其中包含7500条非唯一记录,mysql,ruby-on-rails,ruby-on-rails-5,Mysql,Ruby On Rails,Ruby On Rails 5,由于find_或\u initialize_by(key:…)中的竞争条件问题,我有大约7500条非唯一记录。请建议删除重复项的最佳方法,并为表中的键添加唯一约束。还有什么我应该想到的吗 create_table "posts", force: :cascade do |t| t.bigint "key", null: false t.bigint "parent_key" t.bigint "category_id", null: false t.datet

由于
find_或\u initialize_by(key:…)
中的竞争条件问题,我有大约7500条非唯一记录。请建议删除重复项的最佳方法,并为表中的
添加唯一约束。还有什么我应该想到的吗

  create_table "posts", force: :cascade do |t|
    t.bigint "key", null: false
    t.bigint "parent_key"
    t.bigint "category_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["key"], name: "index_posts_on_key"
    t.index ["parent_key"], name: "index_posts_on_parent_key"
    t.index ["category_id"], name: "index_posts_on_category_id"
  end

要删除重复记录,可以使用
delete。。。从…起联接
语法:

DELETE p1 
FROM posts p1
INNER JOIN posts p2 
WHERE p1.key = p2.key AND p1.created_at > p2.created_at;
这将删除
上的重复项,同时保留在处创建的较早的
记录

然后,您可以添加
唯一
约束:

ALTER TABLE posts ADD CONSTRAINT posts_key_unique UNIQUE(key);
或者更好的是,将
列作为表的主键(因为表似乎还没有主键):


要删除重复记录,可以使用
delete。。。从…起联接
语法:

DELETE p1 
FROM posts p1
INNER JOIN posts p2 
WHERE p1.key = p2.key AND p1.created_at > p2.created_at;
这将删除
上的重复项,同时保留在
处创建的较早的
记录

然后,您可以添加
唯一
约束:

ALTER TABLE posts ADD CONSTRAINT posts_key_unique UNIQUE(key);
或者更好的是,将
列作为表的主键(因为表似乎还没有主键):


这个太宽了。请提供表的结构和示例数据,以便我们能够提供准确的解决方案。因此,请搜索
[mysql]删除重复项
,您将找到许多解决方案。@GMB感谢您的建议!这太宽了。请提供表的结构和示例数据,以便我们能够提供准确的解决方案。因此,请搜索
[mysql]删除重复项
,您将找到许多解决方案。@GMB感谢您的建议!更新如果有多个重复怎么办?相同的记录x7?@assa:如果有7条重复记录,这将删除7条记录中的6条(并保留创建日期最早的记录),如果有多条重复记录呢?相同记录x7?@assa:如果有7条重复记录,这将删除7条记录中的6条(并保留创建日期最早的记录)