Message posté par : ciok
----------------------------------------
Bonjour,
J'ai une base PostGIS créé dans pgAdmin, que j'utilise dans QGIS 3.44. Dans cette
base, l'une de mes tables a l'index suivant (noms modifiés pour confidentialité)
:
-----------------
Code :
CREATE UNIQUE INDEX IF NOT EXISTS mon_index_idx
ON schema.table USING btree
(mon_champ ASC NULLS LAST)
WITH (deduplicate_items=True)
TABLESPACE pg_default
WHERE condition IS TRUE;
-----------------
mon_champ est défini comme bigint NOT NULL
Il est également impliqué dans deux contraintes :
-----------------
Code :
CONSTRAINT contrainte_unicite UNIQUE (mon_champ, mon_autre_champ)
-----------------
et
-----------------
Code :
CONSTRAINT contrainte_fkey FOREIGN KEY (mon_champ)
REFERENCES schema.autre_table (mon_champ_dans_autre_table) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE CASCADE
-----------------
Dans QGIS, par défaut, le formulaire de ma couche coche "Unique" et
"Renforcer la contrainte de valeur unique", sans prendre en compte mon WHERE
condition IS TRUE.
Décocher ces deux paramètres de formulaire sur une couche ou deux ne coûte pas grand
chose.. mais s'il faut le faire sur plein de couches ça peut devenir pénible, et
surtout, je suis curieux.
Une IA générative me dit que :
-----------------
Citation :
Dans QGIS 3.40, le provider PostgreSQL charge les champs en allant chercher les index
uniques avec cette logique :
-----------------
Code :
SELECT DISTINCT indrelid, indkey, indisunique
FROM pg_index
WHERE indisunique
-----------------
puis il associe ça au champ si attnum::text = indkey::text. Il ne récupère pas indpred,
donc il ne sait pas que l’index est partiel.
Or dans PostgreSQL, pg_index.indpred est précisément la colonne qui contient le prédicat
d’un index partiel ; elle vaut NULL seulement si l’index n’est pas partiel.
-----------------
Aller lire le provider PostgreSQL dépasse un peu mes compétences actuelles.
Que pensez-vous de cette explication ?
Pensez-vous que cela puisse être une piste d'amélioration pour les prochaines versions
de QGIS ?
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=377672#p377672
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net