Добавьте уникальное ограничение в базу данных MySQL с 7500 записями, которые не являются уникальными - PullRequest
1 голос
/ 03 октября 2019

Из-за проблем с состоянием гонки в find_or_initialize_by(key: ...) у меня есть около 7500 записей, которые не являются уникальными. Посоветуйте, пожалуйста, лучший способ удалить дубликаты и добавьте в таблицу key ограничение UNIQUE. Есть ли что-то еще, о чем я должен подумать?

  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

1 Ответ

0 голосов
/ 03 октября 2019

Чтобы удалить дублирующиеся записи, вы можете использовать синтаксис DELETE ... FROM ... JOIN:

DELETE p1 
FROM posts p1
INNER JOIN posts p2 
WHERE p1.key = p2.key AND p1.created_at > p2.created_at;

Это удалит дубликаты на key при сохранении записи с более ранним created_at.

* 1008. * Затем вы можете добавить ограничение UNIQUE:
ALTER TABLE posts ADD CONSTRAINT posts_key_unique UNIQUE(key);

Или, что еще лучше, сделать столбец key первичным ключом таблицы (поскольку у таблицы, похоже, еще нет PK):

ALTER TABLE posts ADD PRIMARY KEY(key);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...