Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment vérifier l'enregistrement existant avant d'insérer un enregistrement pour chaque utilisateur dans la même table ?

Une méthode utilise simplement l'agrégation conditionnelle :

insert into users_settings (user_id, key)
    select user_id, 'app_reminder'
    from users_settings
    group by user_id
    having sum(key = 'app_reminder') = 0;

Vous voudrez peut-être une solution plus générique. Si vous voulez vous assurer que les paires utilisateur/clé ne sont jamais dupliquées, créez une contrainte ou un index unique sur ces colonnes :

alter table users_settings add constraint unq_users_settings_user_id_key
    unique (user_id, key);

Ensuite, vous pouvez ignorer l'insertion des lignes en utilisant on duplicate key update :

insert into users_settings (user_id, key)
    select distinct user_id, 'app_reminder'
    from users_settings
    on duplicate key update user_id = values(user_id);

La update ne fait rien, car la valeur est la même. MySQL ignore l'insertion et ne renvoie pas d'erreur.