J'ai une application qui (dans le cadre de sa logique) coupe des cordes et remplace les chaînes vides avec NULL avant l'insertion dans la base de données. Je suppose qu'un moyen de faire en sorte que cela soit exécuté consisterait à écrire un chèque sur chaque table présentant une VARCHAR
, TEXT
(ou similaire).
En supposant que l'on ne puisse pas ou ne veuille pas faire, il existe un moyen d'écrire une requête simple, générique et SQL (obtention des noms de table et de colonne à partir des métadonnées de la base de données) qui vérifieraient si des colonnes textuelles de la base de données contiennent des chaînes vides ?
La meilleure façon de faire est avec une contrainte CHECK
, comme vous l'avez noté, éventuellement via un DOMAIN
, par exemple.
CREATE DOMAIN nonempty_string AS text
CONSTRAINT non_empty CHECK (length(VALUE) > 0);
ensuite, ALTER
colonnes existantes pour utiliser le domaine.
Si cela n'est pas possible, vous devrez interroger INFORMATION_SCHEMA
Pour trouver toutes les colonnes du type cible sur toutes les tables, puis pour chaque colonne, génère de manière dynamique une requête à vérifier. Vous pouvez utiliser pl/pgsql et la déclaration EXECUTE
pour cela; Il existe de nombreux exemples de son utilisation de cette manière ailleurs sur le débordement de la pile.
Vous ne pouvez pas écrire une seule requête pour faire ce que vous voulez. Cela ne fonctionnera tout simplement pas. Vous devrez utiliser la génération de requête à partir de information_schema
.