2011-12-16 8 views
151

Quando ho eseguire questo comando in MySQL:MySQL foreign_key_checks ha effetto sull'intero database?

SET FOREIGN_KEY_CHECKS=0; 

influisce l'intero motore o è solo la mia transazione corrente?

+13

test: accedere a mysql: mostra variabili come '% FOREIGN%'; SET FOREIGN_KEY_CHECKS = 0; Dopo questo accedi a mysql usando una console diversa. Posso vedere che le variabili show come '% FOREIGN%' sono ON invece di OFF. –

risposta

92

realtà, ci sono due foreign_key_checks variabili: una variabile globale e una variabile locale (per sessione). Al momento della connessione, la variabile di sessione viene inizializzata sul valore della variabile globale.
Il comando SET foreign_key_checks modifica la variabile di sessione.
Per modificare la variabile globale, utilizzare SET GLOBAL foreign_key_checks o SET @@global.foreign_key_checks.

consultare le seguenti sezioni del manuale:
http://dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

+1

L'impostazione di foreign_key_checks su ciascuna richiesta è costosa? Ho uno script per aggiornare il DB e non vorrei che nessun altro fosse in grado di sovrascrivere i controlli delle chiavi esterne per impostazione predefinita durante l'aggiornamento. Quindi farei milioni di domande e mi chiedevo se un SET sarebbe significativo o no? – Aki

+0

@Aki Se si sta aggiornando il DB, direi che è meglio bloccare l'accesso per tutti gli altri. Almeno per scrivere. Altrimenti, puoi aspettarti tutti i tipi di problemi di accesso simultaneo. – tishma

+0

Ottima risposta e distinzione. È importante rendersi conto delle conseguenze di come funziona. Significa che non puoi impostare GLOBAL 'foreign_key_checks' e nella stessa sessione aspettarti che ignori i vincoli delle chiavi esterne. Devi impostare la variabile non globale. –

7
# will get you the current local (session based) state. 
SHOW Variables WHERE Variable_name='foreign_key_checks'; 

Se non avete impostato GLOBAL, solo la sessione è stata influenzata.

-1

In caso di utilizzo del browser di query Mysql, SET FOREIGN_KEY_CHECKS=0; non ha alcun impatto nella versione 1.1.20. Tuttavia, funziona bene su Mysql query browser 1.2.17

9

Come spiegato da Ron, ci sono due variabili, locale e globale. La variabile locale viene sempre utilizzata ed è uguale alla connessione globale.

SET FOREIGN_KEY_CHECKS=0; 
SET GLOBAL FOREIGN_KEY_CHECKS=0; 

SHOW Variables WHERE Variable_name='foreign_key_checks'; # always shows local variable 

Quando si imposta la variabile GLOBAL, quella locale non viene modificata per nessuna connessione esistente. È necessario ricollegare o impostare anche la variabile locale.

Forse non intuitivo, MYSQL non applica le chiavi esterne quando FOREIGN_KEY_CHECKS viene riattivato. Ciò rende possibile creare un database incoerente anche se chiavi e assegni esterni sono attivi.

Se si desidera che le proprie chiavi esterne siano completamente coerenti, è necessario aggiungere le chiavi mentre il controllo è attivo.

+1

Puoi approfondire ... "Se vuoi che le tue chiavi esterne siano completamente coerenti, devi aggiungere le chiavi mentre il controllo è attivo." – user2782001

+3

Supponiamo di avere una tabella con ID di riferimento, ma mancano alcuni record di riferimento. Se aggiungi la chiave esterna (FK) mentre FOREIGN_KEY_CHECKS è ON, allora Mysql genererà un errore e si rifiuterà di aggiungere l'FK, a causa del riferimento interrotto. Quando si aggiunge la chiave esterna mentre FOREIGN_KEY_CHECKS è OFF, mysql continua senza errori. Anche quando abiliti i controlli in seguito, non ci saranno errori. Ora hai una tabella con dati incoerenti, anche se c'è un FK. Come tale, l'esistenza di un FK non garantisce la coerenza del database, a meno che non sia stato aggiunto mentre i controlli FK erano attivi. –

Problemi correlati