Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/01/2012, 17h12   #1
Membre du Club
 
Homme
Inscription : novembre 2006
Messages : 146
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34

Informations forums :
Inscription : novembre 2006
Messages : 146
Points : 41
Points : 41
Par défaut Problème avec un index UNIQUE et un comportement SoftDelete

Bonjour à tous,

J'ai créé la plupart de mes tables avec une colonne deleted_at car je ne souhaite pas vraiment supprimer les données de la base, mais les marquer comme supprimées. Il me semble que c'est une pratique assez courante.

Mais il arrive qu'une table ait un index UNIQUE. Et le problème, c'est que MySQL continue d'indexer les enregistrements marqués comme supprimés. Et donc, ça bloque si j'essaie d'enregistrer un nouveau record qui a un index identique à un autre, même s'il est marqué supprimé.

J'espère être suffisamment clair : je voudrais que la vérification d'unicité ne se fasse pas sur les enregistrements marqués comme supprimés. Est-ce possible ?

Merci d'avance
jekif est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 17h15   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
bonjour,

non.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 17h18   #3
Membre du Club
 
Homme
Inscription : novembre 2006
Messages : 146
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34

Informations forums :
Inscription : novembre 2006
Messages : 146
Points : 41
Points : 41
ok merci, suppression définitive obligée alors...
jekif est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 17h23   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
j'irai pas jusque là.

En fait, cet index unique est-ce une primary key ? (ou c'est une clef fonctionnel peut-être ?)

Bref, pourquoi avez-vous besoin de réutiliser un identifiant deleter à cet endroit ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 18h05   #5
Membre du Club
 
Homme
Inscription : novembre 2006
Messages : 146
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34

Informations forums :
Inscription : novembre 2006
Messages : 146
Points : 41
Points : 41
en fait il s'agit d'indexer des ressources (documents, livres, etc). Et on m'a demandé qu'il n'y ait pas deux fois le même titre.

Non ce n'est pas une clé primaire, juste un index unique sur un champ 'titre'. Mais le problème c'est que mysql bloque, même lorsque l'enregistrement 'comparé' est marqué deleted.
jekif est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 20h01   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Oui là y a pas 36 solutions.

Peut-être en l'archivant dans une autre table si vous voullez absolument le garder ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 20h50   #7
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 928
Points : 1 928
Techniquement tu peux créer la contrainte d'unicité sur le couple (titre,deleted_at) avec une fausse date pour les titres en cours mais fonctionnellement je ne sais pas si c'est acceptable pour ton cas.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mysql> CREATE TABLE test (titre varchar(10), deleted_at date DEFAULT date '9999-12-31');
Query OK, 0 rows affected (0.45 sec)
 
mysql> ALTER TABLE test ADD constraint UNIQUE INDEX UK_TITRE (titre, deleted_at);
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
mysql> INSERT INTO test (titre) VALUES ('toto');
Query OK, 1 row affected (0.01 sec)
 
mysql> INSERT INTO test (titre) VALUES ('tata');
Query OK, 1 row affected (0.00 sec)
 
mysql> UPDATE test
    ->    SET deleted_at = current_date
    ->  WHERE titre = 'toto';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
 
mysql> INSERT INTO test (titre) VALUES ('toto');
Query OK, 1 row affected (0.00 sec)
 
mysql> INSERT INTO test (titre) VALUES ('toto');
ERROR 1062 (23000): Duplicate entry 'toto-9999-12-31' FOR KEY 'UK_TITRE'
mysql>
Sinon effectivement réellement supprimer ou historiser.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/01/2012, 09h02   #8
Membre du Club
 
Homme
Inscription : novembre 2006
Messages : 146
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34

Informations forums :
Inscription : novembre 2006
Messages : 146
Points : 41
Points : 41
Merci pour vos réponse. Au vue de ce que vous me dites, je crois que je vais gérer tout cela en amont au niveau logiciel.

Encore merci.
jekif est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h47.


 
 
 
 
Partenaires

Hébergement Web