Domanda

Sto configurando un database usando phpMyAdmin. Ho due tabelle ( foo e bar ), indicizzate sulle loro chiavi primarie . Sto cercando di creare una tabella relazionale ( foo_bar ) tra 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 campi id sono INT (11) .

Quando scelgo la tabella foo_bar , faccio clic sulla vista di " relazione " link e prova a impostare le colonne FK su database.foo.id e database.bar.id , dice " Nessun indice definito! " accanto a ciascuna 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 non avere gli FK esplicitamente definiti nel database.

È stato utile?

Soluzione

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 visualizzazione delle 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.

Altri suggerimenti

phpMyAdmin ti consente di definire le chiavi esterne usando le loro "relazioni" " vista. Ma dal momento che MySQL supporta solo vincoli esterni su " INNO DB " tabelle, il primo passo è assicurarsi che le tabelle che stai utilizzando 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, puoi effettuare le seguenti operazioni:

  1. Per entrambe le tabelle, vai alla scheda Operazioni e modifica il loro tipo in " INNO DB "
  2. Assicurati che ID sia la chiave primaria (o almeno una colonna indicizzata) della tabella PARENT.
  3. Nella tabella CHILD, definisci un indice per la colonna PID.
  4. Durante la visualizzazione della scheda della struttura della tabella BAMBINO, fai clic su " vista relazioni " link appena sopra il " aggiungi campi " sezione.
  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 ti consente di scegliere quale TABELLA- & COL; COLONNA i riferimenti alla colonna indicizzata. Nella riga per PID, seleziona ID GENITORE > 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.

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.

CASCADE

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 (resp. Update [2]).

Limita

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 della 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.

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.

Per coloro 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 sia nella tabella padre che figlio).
  2. Naturalmente sarà già compilato il genitore. Non necessariamente nel bambino in modo vero e definitivo. Quindi, ad esempio, P_ID n. 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. Naturalmente potrebbe essere fatto con i comandi ...

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

quindi fai clic su VISTA RELAZIONE

lì puoi trovare le opzioni per impostare la chiave esterna

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!

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)

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 riavvia il servizio mysqld. inserisci qui la descrizione dell'immagine

Passaggio 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

Passaggio 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: Seleziona la colonna U come avere la chiave esterna come Seleziona la colonna padre dal menu a discesa. dbName.TableName.ColumnName

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

Dalla documentazione ufficiale di MySQL all'indirizzo https : //dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html :

  

MySQL richiede indici su chiavi esterne e chiavi di riferimento in modo che   i controlli delle chiavi esterne possono essere veloci e non richiedono una scansione della tabella.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top