Nettoyer une bas de données postgreSQL

Le
WebShaker
Salut.

J'ai récupéré une base de données postgres ou aucune contrainte d'intégrité
n'existait.
Je les ai donc créée.

J'aimerai maintenant lister tous les enregistrement d'une table qui devrait
être dépendant d'un autre table et que ne le sont pas !

pour etre clair j'ai les deux table suivantes:
CREATE TABLE "resource" (
"idresource" serial NOT NULL,
"desc" text,
PRIMARY key (idresource)
);

CREATE TABLE "trucmuch" [
"idtrucmuch" serial NOT NULL,
"iddesc" integer,
PRIMARY key (idtrucmuch),
FOREIGN key (iddesc) REFERENCES resource (idresource)
);

j'aimerai trouver les idresource qui ne sont pas liée a la table trucmuch.
Bon evidement j'ai des dizaine de table qui sont liée a la table resource.
donc je ne peux pas simplement faire une requete avec une jointure.

pour le moment je n'ai pas trouvé d'autre solution que pour chaque
idresource
- commencer une transaction.
- faire un delete de l'idresource.
- regarder si le delete a fonctionné.
- faire un rollback.

voila ca me donne les resources non associée via une contrainte
d'intégrité

mais je cherche une methode peut etre un peu moins bourrine.

Merci
a+
Etienne
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
SQLpro
Le #21924291
Une simple requête suffit :

DELETE FROM trucmuch
WHERE iddesc NOT IN (SELECT idresource
FROM resource)

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************


WebShaker a écrit :
Salut.

J'ai récupéré une base de données postgres ou aucune contrainte d'intégrité
n'existait.
Je les ai donc créée.

J'aimerai maintenant lister tous les enregistrement d'une table qui devrait
être dépendant d'un autre table et que ne le sont pas !

pour etre clair j'ai les deux table suivantes:
CREATE TABLE "resource" (
"idresource" serial NOT NULL,
"desc" text,
PRIMARY key (idresource)
);

CREATE TABLE "trucmuch" [
"idtrucmuch" serial NOT NULL,
"iddesc" integer,
PRIMARY key (idtrucmuch),
FOREIGN key (iddesc) REFERENCES resource (idresource)
);

j'aimerai trouver les idresource qui ne sont pas liée a la table trucmuch.
Bon evidement j'ai des dizaine de table qui sont liée a la table resource.
donc je ne peux pas simplement faire une requete avec une jointure.

pour le moment je n'ai pas trouvé d'autre solution que pour chaque
idresource
- commencer une transaction.
- faire un delete de l'idresource.
- regarder si le delete a fonctionné.
- faire un rollback.

voila ca me donne les resources non associée via une contrainte
d'intégrité...

mais je cherche une methode peut etre un peu moins bourrine.

Merci
a+
Etienne


WebShaker
Le #21924281
Attention, je ne cherche pas a supprimer les enregistrements.
mais a connaitre les idresource qui pourraient l'être.

dans le but de contrôler leur contenu avant de les supprimer.

Etienne

"SQLpro" 4b8cc61a$0$10081$
Une simple requête suffit :

DELETE FROM trucmuch
WHERE iddesc NOT IN (SELECT idresource
FROM resource)

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************


WebShaker a écrit :
Salut.

J'ai récupéré une base de données postgres ou aucune contrainte
d'intégrité n'existait.
Je les ai donc créée.

J'aimerai maintenant lister tous les enregistrement d'une table qui
devrait être dépendant d'un autre table et que ne le sont pas !

pour etre clair j'ai les deux table suivantes:
CREATE TABLE "resource" (
"idresource" serial NOT NULL,
"desc" text,
PRIMARY key (idresource)
);

CREATE TABLE "trucmuch" [
"idtrucmuch" serial NOT NULL,
"iddesc" integer,
PRIMARY key (idtrucmuch),
FOREIGN key (iddesc) REFERENCES resource (idresource)
);

j'aimerai trouver les idresource qui ne sont pas liée a la table
trucmuch.
Bon evidement j'ai des dizaine de table qui sont liée a la table
resource. donc je ne peux pas simplement faire une requete avec une
jointure.

pour le moment je n'ai pas trouvé d'autre solution que pour chaque
idresource
- commencer une transaction.
- faire un delete de l'idresource.
- regarder si le delete a fonctionné.
- faire un rollback.

voila ca me donne les resources non associée via une contrainte
d'intégrité...

mais je cherche une methode peut etre un peu moins bourrine.

Merci
a+
Etienne
Alcovia
Le #21924271
Le 02/03/2010 10:28, WebShaker a écrit :
Attention, je ne cherche pas a supprimer les enregistrements.
mais a connaitre les idresource qui pourraient l'être.

dans le but de contrôler leur contenu avant de les supprimer.



et bien remplace le DELETE par un SELECT
WebShaker
Le #21924261
"Alcovia" 4b8cdbaa$0$16379$
Le 02/03/2010 10:28, WebShaker a écrit :
Attention, je ne cherche pas a supprimer les enregistrements.
mais a connaitre les idresource qui pourraient l'être.

dans le but de contrôler leur contenu avant de les supprimer.



et bien remplace le DELETE par un SELECT



ben non la je vais les avoir tous.
SQLpro
Le #21924251
WebShaker a écrit :
"Alcovia" 4b8cdbaa$0$16379$
Le 02/03/2010 10:28, WebShaker a écrit :
Attention, je ne cherche pas a supprimer les enregistrements.
mais a connaitre les idresource qui pourraient l'être.

dans le but de contrôler leur contenu avant de les supprimer.


et bien remplace le DELETE par un SELECT



ben non la je vais les avoir tous.




SELECT *
FROM trucmuch
WHERE iddesc NOT IN (SELECT idresource
FROM resource)

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************
WebShaker
Le #21924241
SELECT *
FROM trucmuch
WHERE iddesc NOT IN (SELECT idresource
FROM resource)



Nan c'est toujours pas bon.

comme je l'ai dit.
la table resource peut etre utilisée dans plein d'autre tables. elle
contient les traductions de tous les champ text du projet.

on a donc trucmuch, mai aussi
trucmuch1,
trucmuch2,
trucmuch3,
...

donc je pense que la solution n'est peut etre pas dans une requete SQL
standard mais plutot dans quelques chose utilisant le structure propre a
postgresql...

Etienne
SQLpro
Le #21924231
Alors soyez plus précis :
donnez nous des exemples concrets avec
1) vos tables sous forme DDL (CREATE
2) un jeu d'essais sous forme INSERT
3) une idée du résultat

Sachez qu'aucune chose est impossible sous forme de requête SQL parce
que SQL est un langage complet au sens de la machine de turing !

A +

WebShaker a écrit :
SELECT *
FROM trucmuch
WHERE iddesc NOT IN (SELECT idresource
FROM resource)



Nan c'est toujours pas bon.

comme je l'ai dit.
la table resource peut etre utilisée dans plein d'autre tables. elle
contient les traductions de tous les champ text du projet.

on a donc trucmuch, mai aussi
trucmuch1,
trucmuch2,
trucmuch3,
...

donc je pense que la solution n'est peut etre pas dans une requete SQL
standard mais plutot dans quelques chose utilisant le structure propre a
postgresql...

Etienne






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************
helios
Le #21924221
SQLpro a écrit :
Alors soyez plus précis :
donnez nous des exemples concrets avec
1) vos tables sous forme DDL (CREATE
2) un jeu d'essais sous forme INSERT
3) une idée du résultat

Sachez qu'aucune chose est impossible sous forme de requête SQL parce
que SQL est un langage complet au sens de la machine de turing !

A +





il est même possible d'après un certain auteur de livre sur SQL de coder
avec SQL toute les dates depuis Jesus Christ jusque nos jours sur 2
octets, c'est trés fort d'arriver à coder plus 733650 valeurs sur deux
octet (2^16 ou 65536)mais SQL est miraculeux :-)

attention l'auteur va faire un procès en diffamation si on ne croit pas
au miracle de SQL
Patrick Mevzek
Le #21924211
Le Wed, 03 Mar 2010 08:58:53 +0100, WebShaker a écrit:
on a donc trucmuch, mai aussi
trucmuch1,
trucmuch2,
trucmuch3,
...



SELECT * FROM resource
WHERE idresource NOT IN
(
SELECT iddesc FROM trucmuch
UNION
SELECT iddesc FROM trucmuch1
UNION
SELECT iddesc FROM trucmuch2
)

--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
Publicité
Poster une réponse
Anonyme