Configurare le chiavi esterne in phpMyAdmin?


336

Sto configurando un database usando phpMyAdmin. Ho due tabelle ( fooe bar), indicizzate sulle loro chiavi primarie . Sto cercando di creare una tabella relazionale ( foo_bar) tra di loro, usando le loro chiavi primarie come chiavi esterne.

Ho creato queste tabelle come MyISAM, ma da allora le ho cambiate tutte e tre in InnoDB, perché ho letto che MyISAM non supporta le chiavi esterne. Tutti i idcampi sono INT(11).

Quando scelgo la foo_bartabella, faccio clic sul collegamento "vista relazioni" e provo a impostare le colonne FK in modo che database.foo.idsia database.bar.id, dice "Nessun indice definito!" accanto a ogni colonna.

Cosa mi sto perdendo?

Chiarimento / Aggiornamento

Per semplicità, voglio continuare a usare phpMyAdmin. Attualmente sto usando XAMPP, che è abbastanza facile da farmi concentrare su PHP / CSS / Javascript, e viene fornito con phpMyAdmin.

Inoltre, sebbene non sia stato ancora possibile impostare chiavi esterne esplicite, ho una tabella relazionale e posso eseguire join in questo modo:

SELECT * 
FROM foo 
INNER JOIN foo_bar 
ON foo.id = foo_bar.foo_id 
INNER JOIN bar
ON foo_bar.bar_id = bar.id;

Mi sento a disagio a non avere gli FK esplicitamente definiti nel database.

Risposte:


366

Se vuoi usare phpMyAdmin per impostare relazioni, devi fare 2 cose. Prima di tutto, devi definire un indice sulla colonna chiave esterna nella tabella di riferimento (quindi foo_bar.foo_id, nel tuo caso). Quindi, vai alla vista relazioni (nella tabella di riferimento) e seleziona la colonna di riferimento (quindi nel tuo caso foo.id) e le azioni on update e on delete.

Penso che le chiavi esterne siano utili se hai più tabelle collegate tra loro, in particolare, i tuoi script di eliminazione diventeranno molto brevi se imposti correttamente le opzioni di riferimento.

EDIT: assicurati che su entrambe le tabelle sia selezionato il motore InnoDB.


93
Suggerimento: la visualizzazione delle relazioni è un piccolo link sotto il tuo tavolo, è stato difficile per me trovarlo in primo luogo
Mladen Janjetovic,

14
A meno che quel link non venga mostrato qui, nel qual caso: Assicurati che la tua tabella sia di tipo InnoDB (nella scheda Operazioni in phpMyAdmin) affinché ciò non accada.
muttley91,

4
@ muttley91La mia tabella è InnoDB. Ho ricontrollato. Il collegamento non viene ancora visualizzato.
afilina,

6
@afilina Nella nuova versione di phpMyAdmin, è visibile nella parte superiore della scheda "Struttura", appena sotto la riga della scheda che mostra "Sfoglia", "Struttura", ecc.
Astitva Srivastava,

226

phpMyAdmin ti consente di definire le chiavi esterne usando la loro vista "relazioni". Ma poiché MySQL supporta solo vincoli esterni sulle tabelle "INNO DB", il primo passo è assicurarsi che le tabelle utilizzate siano di quel tipo.

Per impostare una chiave esterna in modo che la colonna PID in una tabella denominata CHILD faccia riferimento alla colonna ID in una tabella denominata PARENT, è possibile effettuare le seguenti operazioni:

  1. Per entrambe le tabelle, vai alla scheda Operazioni e modifica il loro tipo in "INNO DB"
  2. Assicurarsi che ID sia la chiave primaria (o almeno una colonna indicizzata) della tabella PARENT.
  3. Nella tabella CHILD, definire un indice per la colonna PID.
  4. Durante la visualizzazione della scheda struttura della tabella BAMBINO, fai clic sul link "vista relazioni" appena sopra la sezione "aggiungi campi".
  5. Ti verrà data una tabella in cui ogni riga corrisponde a una colonna indicizzata nella tabella CLIENT. Il primo menu a discesa in ogni riga consente di scegliere quale TABELLA-> COLONNA fa riferimento alla colonna indicizzata. Nella riga per PID, seleziona GENITORE-> ID dal menu a discesa e fai clic su VAI.

Eseguendo un'esportazione sulla tabella CHILD, dovresti vedere un vincolo di chiave esterna creato per la colonna PID.


2
Wow, cosa molto importante da sapere. Questa pagina non è stata la prima cosa che ho trovato in cerca di aiuto con l'aggiunta di una chiave esterna, vorrei che questo fosse menzionato più spesso.
user1299656

87

Questo è il riassunto di un articolo di Wikipedia. Specifica i diversi tipi di relazioni che è possibile stabilire in PHPmyadmin. Lo sto mettendo qui perché è pertinente al commento di @ Nathan sull'impostazione delle opzioni di chiavi esterne per "su aggiornamento / eliminazione" ma è troppo grande per un commento - spero che sia di aiuto.

CASCATA

Ogni volta che le righe nella tabella principale (referenziate) vengono eliminate (rispettivamente aggiornate), anche le rispettive righe della tabella figlio (referenziate) con una colonna di chiave esterna corrispondente verranno eliminate (rispettivamente aggiornate). Questo si chiama eliminazione in cascata (risp. Update [2]).

LIMITARE

Un valore non può essere aggiornato o eliminato quando esiste una riga in una tabella di chiavi esterne che fa riferimento al valore nella tabella di riferimento. Allo stesso modo, una riga non può essere eliminata purché vi sia un riferimento da una tabella di chiavi esterne.

NESSUNA AZIONE

NESSUNA AZIONE e RESTRETTO sono molto simili. La differenza principale tra NO AZIONE e RESTRETTO è che in NO AZIONE il controllo di integrità referenziale viene eseguito dopo aver tentato di modificare la tabella. RESTRICT esegue il controllo prima di provare a eseguire l'istruzione UPDATE o DELETE. Entrambe le azioni referenziali agiscono allo stesso modo se il controllo di integrità referenziale fallisce: l'istruzione UPDATE o DELETE comporterà un errore.

SET NULL

I valori della chiave esterna nella riga di riferimento vengono impostati su NULL quando la riga di riferimento viene aggiornata o eliminata. Questo è possibile solo se le rispettive colonne nella tabella di riferimento sono nullable. A causa della semantica di NULL, una riga di riferimento con NULL nelle colonne di chiave esterna non richiede una riga di riferimento.

IMPOSTA DEFAULT

Simile a SET NULL, i valori della chiave esterna nella riga di riferimento vengono impostati sulla colonna predefinita quando la riga di riferimento viene aggiornata o eliminata.


1
Meglio ancora, vai direttamente alla documentazione sorgente di MySQL: dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
kmoser

63

In phpmyadmin, puoi assegnare la chiave esterna semplicemente tramite la sua GUI. Fai clic sulla tabella e vai alla scheda Struttura. trova la Vista relazione solo sotto il tavolo (mostrato nell'immagine sotto).

inserisci qui la descrizione dell'immagine

È possibile assegnare la chiave di forgiatura dalla casella di riepilogo vicino alla chiave primaria (vedere l'immagine sotto). e salva

inserisci qui la descrizione dell'immagine

query SQL corrispondente generata ed eseguita automaticamente.


17

Per quelli che non conoscono il database .... e devono ALTERARE una tabella esistente. Molte cose sembrano essere piuttosto semplici, ma c'è sempre qualcosa ... tra A e B.

Prima di ogni altra cosa, dai un'occhiata a questo .

  1. Assicurati di avere P_ID (ID padre sulla tabella padre e figlio).
  2. Naturalmente sarà già compilato il genitore. Non necessariamente nel bambino in modo vero e definitivo. Quindi, ad esempio, P_ID # 3 (forse molte volte nella tabella figlio indicherà il P_ID originale nella tabella padre).
  3. Vai alla scheda SQL (sto usando phpMyAdmin, dovrebbe essere simile in altri) ed esegui questo comando:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
  4. Fare clic sulla tabella figlio, quindi sulla struttura, infine sulla vista relazionale. Termina la tua pianificazione DB lì. C'era una bella risposta prima di questa su cascata, limitazione, ecc. Certo che poteva essere fatto con i comandi ...


9

Chiave esterna significa che un attributo non primo di una tabella fa riferimento all'attributo primo di un altro * in phpMyAdmin * prima imposta la colonna che vuoi impostare come chiave esterna come indice

quindi fare clic su VISUALIZZAZIONE RELAZIONE

lì puoi trovare le opzioni per impostare la chiave esterna


7

InnoDB consente di aggiungere un nuovo vincolo di chiave esterna a una tabella utilizzando ALTER TABLE:

ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

D'altra parte, se MyISAM presenta vantaggi rispetto a InnoDB nel tuo contesto, perché dovresti voler creare vincoli di chiave esterna. È possibile gestirlo a livello di modello dell'applicazione. Assicurati solo che le colonne che vuoi usare come chiavi esterne siano indicizzate!


4
I vincoli delle chiavi esterne mi fanno risparmiare molto sforzo e potenziali errori. Ad esempio, supponiamo che eliminerò un utente dal mio sistema. Potrei scrivere il codice che specifica ogni posizione nel database in cui esistono i dati su quell'utente e dirgli di eliminarlo. Ma devo tenere sempre aggiornata la funzione di eliminazione. D'altra parte, se tutti i dati relativi all'utente hanno un FK per l'ID dell'utente e sono impostati in cascata all'eliminazione, tutto il mio codice ha da dire è "elimina questo utente" e il database si occuperà di eliminare tutto ciò che ha un riferimento FK a quell'utente. Molto più pulito da mantenere.
Nathan Long,

1
@Nathan: questo è quello che sto dicendo nel post. Puoi gestirlo anche a livello di modello. È possibile implementare su elimina cascata dal modello.
markus,

3
Quasi sempre si aggiunge l'integrità referenziale alle tabelle del database. Il database dovrebbe proteggersi da una cattiva programmazione dell'applicazione. Non fare affidamento solo sulla tua applicazione per mantenere l'integrità dei dati. Naturalmente ci sono sempre delle eccezioni ad ogni regola, ma non ne ho trovata una per questo.
Harv,

4

Non dimenticare che le due colonne devono avere lo stesso tipo di dati.

ad esempio se una colonna è di tipo INT e l'altra è di tipo tinyint, verrà visualizzato il seguente errore:

Errore durante la creazione della chiave esterna su [colonna PID] (verifica tipi di dati)


3

Passaggio 1: devi aggiungere la riga: default-storage-engine = InnoDB nella sezione [mysqld] del tuo file di configurazione mysql (my.cnf o my.ini a seconda del tuo sistema operativo) e riavviare il servizio mysqld. inserisci qui la descrizione dell'immagine

Passo 2: Ora quando crei la tabella vedrai che il tipo di tabella è: InnoDB

inserisci qui la descrizione dell'immagine

Passaggio 3: creare una tabella padre e figlio. Ora apri la tabella figlio e seleziona la colonna U come per avere la chiave esterna: Seleziona la chiave indice dall'etichetta azione come mostrato di seguito.

inserisci qui la descrizione dell'immagine

Passo 4: Ora apri la Vista relazione nella stessa tabella figlio dal basso vicino alla Vista Stampa come mostrato di seguito.

inserisci qui la descrizione dell'immagine Passaggio 5: selezionare la colonna U come per avere la chiave esterna come Selezionare la colonna padre dal menu a discesa. dbName.TableName.ColumnName

Selezionare i valori appropriati per ON DELETE e ON UPDATE inserisci qui la descrizione dell'immagine


2

Innanzitutto imposta Storage Engine come InnoDB

Innanzitutto imposta Storage Engine come InnoDB

quindi l' opzione di visualizzazione delle relazioni abilita nel menu struttura

quindi abilita l'opzione di visualizzazione delle relazioni


il tuo primo passo è corretto ma per quanto riguarda il prossimo, per favore scrivi tutto il processo passo dopo passo.
kunal shaktawat,

2

Questo è vecchio thread ma rispondi perché se utile a chiunque.

Fase 1 . Il motore di archiviazione Db impostato su InnoDB

Passaggio 2 . Crea tabella primaria

qui customerè la tabella principale ed customer_idè la chiave primaria

inserisci qui la descrizione dell'immagine

Passaggio 3 . creare una tabella di chiavi esterne e dare indice

qui abbiamo customer_addressescome tabella correlata e memorizzare gli indirizzi dei clienti, quindi qui customer_idrelazione con la customertabella

possiamo selezionare direttamente l'indice quando creiamo una tabella come di seguito

inserisci qui la descrizione dell'immagine

Se hai dimenticato di dare un indice quando crei una tabella , puoi dare un indice dalla scheda struttura della tabella come di seguito.

inserisci qui la descrizione dell'immagine

Passaggio 4 . Una volta che l'indice viene assegnato al campo, vai alla scheda struttura e fai clic su Vista relazione come mostrato nell'immagine seguente

inserisci qui la descrizione dell'immagine

Passaggio 5 . Ora selezionare il ON DELETE e ON UPDATE ciò che si vuole fare, Selezionare la colonna dalla tabella corrente, selezionate DB (SAME DB), selezionare tabella di relazione e la chiave primaria da quel tavolo, come mostrato in seguito pic e Salva esso

inserisci qui la descrizione dell'immagine

Ora controlla se la relazione viene fornita correttamente, vai all'elenco dei dati della tabella esterna e fai clic sul valore della chiave esterna, reindirizzerai al record della tabella principale, quindi la relazione viene stabilita correttamente.



0

Le versioni più recenti di phpMyAdmin non hanno più l'opzione " Vista relazione ", nel qual caso dovrai eseguire un'istruzione per ottenere la stessa cosa. Per esempio

ALTER TABLE employees
    ADD CONSTRAINT fk_companyid FOREIGN KEY (companyid)
    REFERENCES companies (id)
    ON DELETE CASCADE;

In questo esempio, se viene eliminata una riga dalle società, vengono eliminati anche tutti i dipendenti con tale companyid.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.