Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Conflitti tra chiavi

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    13

    Conflitti tra chiavi

    Ciao a tutti,
    Spero che qualcuno mi possa aiutare a risolve questo problema, che non mi consente di andare avanti.
    Quando tento di salvare nuovi dati inseriti in un precedente form mi appare:

    Duplicate entry '00001' for key 1

    Ho creato due tabelle di prova:

    Tabella nome:

    idpers
    cognome
    login
    passd

    tabella telefoni:
    raccordo
    idtel
    num_tel

    Script per richiamere le due query;
    / IMPOSTAZIONE DELLA QUERY
    $stmt="select $ms_database.nome.idpers,
    $ms_database.nome.cognome,
    $ms_database.nome.login,
    $ms_database.nome.passd

    from $ms_database.nome
    where $m $ms_database.nome.login='$login' and $ms_database.nome.passd=$passd;
    ";

    $result = mysql_query($stmt);


    $n_nome=0;


    if ($result)
    {
    // Risultato OK
    // leggo tutti i record e li memorizzo all'interno di specifici array

    while (list($idpers,
    $cognome,
    $login,
    $passd

    )=mysql_fetch_row($result))
    {


    $A_idpers[]=$idpers;
    $A_cognome[]=$cognome;
    $A_login[]=$login;
    $A_passd[]=$passd;

    $n_nome++;

    }
    mysql_free_result($result);
    }
    else
    {
    // Se invece c'è stato un errore visualizzo la query che l'ha generato
    print "ERRORE!
    $stmt
    ";
    }


    print"numero di volte:$A_idpers[0] $A_cognome[0]";

    // IMPOSTAZIONE DELLA QUERY
    $stmt="select $ms_database.telefoni.raccordo,
    $ms_database.telefoni.idtel,
    $ms_database.telefoni.num_tel


    from $ms_database.telefoni
    left join $ms_database.nome on
    $ms_database.nome.idpers=$ms_database.telefoni.rac cordo
    where $ms_database.telefoni.raccordo='$A_idpers[0]'
    ";

    $result = mysql_query($stmt);


    $n_telef=0;

    if ($result)
    {
    // Risultato OK
    // leggo tutti i record e li memorizzo all'interno di specifici array

    while (list($raccordo,
    $idetl,
    $num_tel

    )=mysql_fetch_row($result))
    {



    $A_raccordo[]=$raccordo;
    $A_idtel[]=$idtel;
    $A_num_tel[]=$num_tel;
    $n_telef++;


    }
    mysql_free_result($result);
    $A_raccordo[]=$A_idpers[0];
    }
    else
    {
    // Se invece c'è stato un errore visualizzo la query che l'ha generato
    print "ERRORE!
    $stmt
    ";
    }

    $A_raccordo[]=$A_idpers[0];


    Script per salvare i nuovi dati:
    //IMPOSTAZIONE DELLA QUERY

    $stmt="INSERT INTO $ms_database.telefoni (
    telefoni.raccordo,
    telefoni.idtel,
    telefoni.num_tel

    ) VALUES (
    '$raccordo',
    '$idtel',
    '$num_tel'

    )";





    $result = mysql_query($stmt);

    if (!$result)
    {
    // Se invece c'è stato un errore visualizzo la query che l'ha generato
    print "ERRORE!
    ".mysql_error()."
    $stmt";
    }
    else
    {

    print" chiave esterna: $raccordo salvato correttamente";
    print" chiave primaria: $idtel salvato correttamente";
    print" nemuro di telefono: $num_tel salvato correttamente";

    Spero qualcuno riesca a risolvere questo problema
    Grazie

  2. #2
    $stmt="INSERT INTO $ms_database.telefoni (
    telefoni.raccordo,
    telefoni.idtel,
    telefoni.num_tel

    ) VALUES (
    '$raccordo',
    '$idtel',
    '$num_tel'

    )";
    Quando inserisci una riga in telefoni dove vai a prendere '$idtel'?

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    13
    Ciao,
    idtel va ad inserirlo l'utente nella form.
    Dovrebbe funzionare così:
    I profili della tabella nome vengono inseriti dall'amministratore. Mentre i dati della tabella telefoni vengono inseriti dall'utente.
    L'idea è quella di copiare idpers in raccordo che è la chiave esterna. Questo permette di far apparire nella form l'indice della tabella nome, far inserire l'indice della tabella telefoni e il numero di telefono e poi il tutto di salvarlo nella tabella telefoni.
    Purtroppo mi dice che c'è una duplicazione delle chiavi e non riesco a risolvere il problema
    Altro problema è la fase successiva. Ho inserito la possibilità di fare immediatamente l'inserimento di un nuovo profilo, ma quando ritorno alla form di inserimento della tabella telefoni, nella stessa non ho più l'indice di raccordo di riferimento, ma uno spazio vuoto.

    Confido nel vostro aiuto altrimenti non riesco ad andare avanti.
    Grazie per l'aiuto.

  4. #4
    mi passi la struttura del DB?

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    13
    ti allego la struttura delle due tabelle:

    Struttura della tabella `nome`
    --

    CREATE TABLE `nome` (
    `idpers` varchar(10) collate latin1_general_ci NOT NULL,
    `cognome` varchar(10) collate latin1_general_ci NOT NULL,
    `login` varchar(10) collate latin1_general_ci NOT NULL,
    `passd` varchar(10) collate latin1_general_ci NOT NULL,
    PRIMARY KEY (`idpers`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

    --
    -- Dump dei dati per la tabella `nome`
    --

    INSERT INTO `nome` (`idpers`, `cognome`, `login`, `passd`) VALUES
    ('00001', 'Rossi', 'pippo', '123'),
    ('00002', 'Verdi', 'pluto', '456'),
    ('00003', 'Bianchi', 'paperino', '789');


    Questi dati vengono inseriti dall'amministratore

    Struttura della tabella `telefoni`
    --

    CREATE TABLE `telefoni` (
    `raccordo` varchar(10) collate latin1_general_ci NOT NULL,
    `idtel` varchar(10) collate latin1_general_ci NOT NULL,
    `num_tel` varchar(10) collate latin1_general_ci NOT NULL,
    PRIMARY KEY (`idtel`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

    --
    -- Dump dei dati per la tabella `telefoni`
    --

    INSERT INTO `telefoni` (`raccordo`, `idtel`, `num_tel`) VALUES
    ('00001', '00001', '023756'),
    ('00001', '00002', '05790454'),
    ('00001', '00003', '87554547'),
    ('00001', '00004', '345346');

    Questi ultimi dati vengono inseriti dalla utente nella form.
    Grazie

  6. #6
    ma scusa se idtel è una primary key, è chiaro che quando cerchi di inserirne due uguali mysql ti ritorni un errore. Ma tu vuoi che vi sia una relatione tra le due tabelle del tipo:

    nome <-->> telefoni (che sta a significare che un nome può aver associato più numeri di telefono, ma un telefono può essere associato ad un solo nome)
    ?

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    13
    Questa sarebbe l'idea.
    Scusa la domanda: ma per ogni tabella non ci deve essere un indice che mi permette di collegare due tabelle?
    Mi puoi dire come posso fare?
    Grazie

  8. #8
    si chiama ForeingKey, è una chiave che esite nella Tabella diversa dalla PrimaryKey.
    L'idea della foreing key è di creare una dipendenza tra due tabelle, la tabella di riferimento (che non contiene la FK) e la tabella referente (che contiene FK).
    La dipendenza si crea quando in un campo (nel tuo caso un nuovo campo "idnome", nella tabella telefoni) viene popolato con la PrimaryKey della tabella di riferimento (nome, nel tuo caso).
    L'idea della relazione è che l'esistenza delle righe nella tabella con la FK dipende direttamente dall'esistenza del corrispondente riga nella tabella senza (cioè l'esistenza o meno delle righe nella tabella telefoni, ad esempio, dipende se esiste o meno il corrispondente nome, dopotutto che senso avrebbe avere un numero di tel se non c'è l'utente corrispondente?).
    Questo tipo di relazione di chiama DELETE CASCADE, ed implica la cancellazione delle righe nella tabella con FK, quando nella tabella di riferimento vengono cancellate le righe con PK = alla FK.

    Spero di essermi spiegato: tu devi creare un altro campo "idnome", nella tabella "telefoni", ed indicarlo come ForeignKey della tabella "nome", sul campo "idnome" della stessa.
    A questo punto la tua query di inserimento sarà:

    $idnome = l'ID del nome corrispondente all'utente

    $stmt="INSERT INTO $ms_database.telefoni (
    telefoni.raccordo,
    telefoni.idnome,
    telefoni.num_tel

    ) VALUES (
    '$raccordo',
    '$idnome',
    '$num_tel'
    )";

    E, se vuoi facilitarti le cose, metti le PK come AUTO_INCREMENT, che non devi settarle.

    Ci sono anche altre regole di FK, che vengono attivate quando nella tabella di riferimento le righe vengono modificate, di solito sul DELETE:
    CASCADE: cancella le righe con FK = alla PK della tabella di riferimento, quando le righe corrispondenti nella tabella di riferiemento vengono cancellate
    RESTRICT: Nessuna modifica nella tabella di riferiemento (quella senza FK) può essere alterata fintanto che almeno una riga nella tabella referente (con FK) ha il campo FK = alla PK della tabella di riferimento
    NO ACTION: Semplicemente non fa nulla alla tabella referente (con FK). Controlla le violzioni alle rigole.
    SET NULL: quando una riga nella tabella di riferimento è cancellata, le corrispondenti righe nella tabella referente vengono aggiornate con la FK a null.
    SET DEFAULT: stesso di set null, ma le righe nella tabella referente vengono settate al valore di default anziché a null.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    13
    Grazie dell'aiuto.
    Adesso provo a lavorare sulle informazioni che mi hai passato.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.