Visualizzazione dei risultati da 1 a 6 su 6

Discussione: trigger pl\pgsql

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2013
    Messaggi
    10

    trigger pl\pgsql

    Ciao a tutti ho un piccolo database per la gestione di un sistema di votazioni online ,questo trigger parte all'aggiornamento di un campo di una tabella,tutto bene a parte il fatto che se OLD.ballottaggio è = false ovvero non entra nell'if tutto funziona alla perfezione, mentre se è true mi restituisce questo errore:
    un valore chiave duplicato viola il vincolo univoco "elezione_pkey"
    DETAIL: La chiave (id, turno)=(1, ballottaggio) esiste già.

    IL PROBLEMA è che ovviamente non eissiste gia un record con quella chiave primaria ma appunto è quello che dovrebbe creare...non ho idea di dove sbattere la testa...sbaglio qualcosa?

    codice:
    CREATE OR REPLACE FUNCTION InserimentoElezione() RETURNS TRIGGER AS $$
    
    	DECLARE
    	Datainizio DATE%TYPE;
    	Datafine DATE%TYPE;
     	Giorni Integer;
    	Get_vinc candidatura.utente_cf%TYPE;
    	Get_secondo candidatura.utente_cf%TYPE;
    	Getid elezione.Id%TYPE;
            Getturno elezione.Turno%TYPE;
    	
    	BEGIN
    	      SELECT OLD.id INTO Getid;
                  SELECT OLD.turno INTO Getturno;
    
    		IF(OLD.ballottaggio = TRUE)
    		THEN
    			Giorni=OLD.Dataf-OLD.Datain;
    			Datainizio = OLD.Dataf + '4 days'::interval ;
    			Datafine = Datainizio+Giorni;
    	
    			INSERT INTO elezione VALUES (OLD.Id , 'ballottaggio' , OLD.nomecarica , Datainizio, Datafine , FALSE , OLD.Descrizione , FALSE);
    			
    			SELECT Primo(OLD.Id, 'primo') INTO Get_vinc;
    			SELECT Secondo(OLD.Id, 'primo') INTO Get_secondo;
    			
    			INSERT INTO candidatura VALUES( OLD.Id, Get_vinc , FALSE , 0 , 'ballottaggio');
    			INSERT INTO candidatura VALUES( OLD.Id, Get_secondo , FALSE , 0 , 'ballottaggio');
    		ELSE
    			PERFORM vincitore(Getid,Getturno);
    		
    		END IF;
    
    		RETURN NEW;
    		
    	END
    	
    	$$ LANGUAGE plpgsql;
    	
    CREATE TRIGGER ControlloBallottaggio BEFORE UPDATE OF Scaduta ON elezione FOR EACH ROW  EXECUTE PROCEDURE InserimentoElezione();

  2. #2
    Scusa ma se le insert non hanno i nomi dei campi potresti almeno dirci quale insert scatena l'errore
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2013
    Messaggi
    10
    Originariamente inviato da in the web
    Scusa ma se le insert non hanno i nomi dei campi potresti almeno dirci quale insert scatena l'errore
    INSERT INTO elezione VALUES (OLD.Id , 'ballottaggio' , OLD.nomecarica , Datainizio, Datafine , FALSE , OLD.Descrizione , FALSE);

    i valori old li prende correttamente ne sono sicuro . l'errore dice che il record che tenta di inserire ha gia una chiave presente nella tabella di riferimento..ma ovviamente non è vero..

  4. #4
    Fai DESC elezione e controlla se l'ordine delle colonne è giusto, o ancora meglio metti i nomi delle colonne nella insert
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2013
    Messaggi
    10
    Originariamente inviato da in the web
    Fai DESC elezione e controlla se l'ordine delle colonne è giusto, o ancora meglio metti i nomi delle colonne nella insert
    l'ordine è giusto anche inserendo i valori a mano come hai detto te da lo stesso errore :
    ERRORE: un valore chiave duplicato viola il vincolo univoco "elezione_pkey"
    DETAIL: La chiave (id, turno)=(1, ballottaggio) esiste già.



    non esiste quel cavolo di record se faccio
    select * from elezione where id=1 and turno='ballottaggio';
    da nessun risultato!!!! perchè mai nel trigger dovrebbe dire che esiste gia ?

  6. #6

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.