7
votes

Vertica: validation des données de la clé en double / primaire

J'essaie de créer une procédure de validation lors d'une charge qui vérifie que les données ne sont pas dupliquées. Vertica ne supporte pas cette natalement:

Vertica vérifie les violations de contraintes lorsque les requêtes sont exécutées, non lorsque les données sont chargées. Détecter les violations de contraintes dans le cadre de la Processus de charge, utilisez une déclaration de copie (page 667) avec le no commit option. En chargement des données sans l'avoir commis, vous pouvez exécuter un post-charge. Vérifiez de vos données à l'aide de la fonction analyser_constraints. Si la fonction trouve des violations de contraintes, vous pouvez faire rouler la charge parce que vous ne l'avez pas commis. p> BlockQuote>

Le problème est que je ne peux pas comprendre comment faire cela par programme. Je soupçonne que j'ai besoin d'une procédure stockée, mais je ne connais pas la syntaxe de procédure stockée / limitations pour Vertica. Pouvez-vous aider? Voici ce que j'ai: p> xxx pré>

Ma pensée est de faire une logique conditionnelle. Pseudo-code est ci-dessous. Pouvez-vous m'aider à le préparer pour Vertica? P>

Begin
load data
if (select count(*) from (select analyze_constraints('my_table')) sub) == 0:
commit
else rollback


0 commentaires

3 Réponses :


1
votes

Vertica n'a pas stocké de procédures stockées. Vous devrez le faire par programme de manière programmatique à l'extérieur de Vertica.

La logique Psuedo que vous avez est bonne; Je viens de le mettre en œuvre dans quelque chose (Java, C ++, ECT). Vous n'aurez pas besoin d'exécuter un «rollback». Lors du chargement des données (avec noted ), il ne sera pas commis jusqu'à ce que vous exécutez une instruction commit .


0 commentaires

4
votes
-- Start by Setting Vertica up to rollback and return an error code 
-- if an error is encountered.

\set ON_ERROR_STOP on

-- Load Data here (code omitted since you already have this)


-- Raise an Error condition by selecting 1/0 if any rows were rejected
-- during the load
SELECT
         GET_NUM_REJECTED_ROWS() AS NumRejectedRows
        ,GET_NUM_ACCEPTED_ROWS() AS NumAcceptedRows
;

SELECT 1 / (1-SIGN(GET_NUM_REJECTED_ROWS()));


-- Raise an Error condition if there are duplicates in my_table
SELECT 1 / ( 1 - SIGN( COUNT(*) ) )
FROM ( SELECT  name1,type1,description1
         FROM MY_TABLE
       GROUP BY 1,2,3
       HAVING COUNT(*) > 1 ) AS T1 ;

-- Raise an Error if primary key constraint is violated.
SELECT 1 / ( 1 - SIGN( COUNT(*) ) )
FROM (SELECT  ANALYZE_CONSTRAINTS ('my_table')) AS T1;

COMMIT;    

2 commentaires

Doug, merci pour cela - je n'étais totalement pas au courant de la fonction get_num_rejected_rows jusqu'à présent (ou la table Load_streams, à ce sujet). Merci!


\ Ensemble on_error_stop On ne fonctionne pas en Vertica 5.1: Erreur: Erreur: Erreur: Erreur: Erreur de syntaxe à ou proches de "\" et si je suis suivant: SET ON_ERROR_STOP sur "ON" I Obtenir une erreur: Erreur: Définir l'option non supportée sur_error_stop



0
votes

Qu'en est-il de l'utilisation d'ANSI Fusionner?

-Upload les données à l'aide du chargeur voleur rapide sur une table TEMP -Mérité de la table Temp dans la table de base


0 commentaires