creazione tabelle e utilizzo delle FK con ENGINE=INNODB

salve ^^

è la prima volta che scrivo qua...

dunque ho un problema che non son riuscito a risolvere riguardante la creazione delle tabelle con mysql.

posto il mio test (man mano che ho testato queste poche righe le ho ridotte sempre più fino all'osso).

prima tabella:

create TABLE interna
(id_int int AUTO_INCREMENT, 
est int, 
PRIMARY KEY (id_int), 
FOREIGN KEY (est) REFERENCES esterna(id_est) ON DELETE SET NULL ON UPDATE CASCADE);

seconda tabella:

create TABLE esterna
(id_est int AUTO_INCREMENT, 
dato int, 
PRIMARY KEY (id_est));

alla fine di ogni definizione inserivo anche sia "type=innodb" che "engine=innodb" ma mi han sempre dato errore. adesso uso la sintassi di cui sopra, mi crea le tabelle con engine=myisam, poi un ALTER TABLE <nome_tabella> ENGINE=INNODB e non mi dà più problemi, cambiando il "motore".

fatto ciò popolo le due tabelle per eseguire il test.

smanettando un po' i campi (più che altro "esterna.id_est"), mi sarei aspettato che le istruzioni definite nella tabella "interna" ...ON DELETE SET NULL ON UPDATE CASCADE... si rendessero conto delle mie azioni; invece no: se io metto o meno queste istruzioni in ogni caso le due tabelle non si accorgono di ciò che succede fra i loro dati.

se io eliminassi o modificassi la PK di "esterna", la tabella "interna" non dovrebbe modificare i valori della sua FK secondo quanto scritto nel comando per la sua creazione?

altra domanda: dove trovo una qualche guida che mi spieghi come usare per bene le FK? perchè se le dichiaro e poi non funzionano, che senso ha dichiararle? faccio prima a considerarle "colonne normali" e me le gestisco manualmente da me via script (pasiensa); ma se hanno creato questa struttura e il motore innodb, un modo ci sarà, no?

grazie

inviato 8 anni fa
larchitetto
X 0 X

...nessuno sa aiutarmi?

risposto 8 anni fa
larchitetto
X 0 X

entrambe le tabelle siano di tipo InnoDB OK

non siano inclusi campi di tipo BLOB o TEXT nelle chiavi usate OK

entrambe le tabelle abbiano un indice in cui i campi interessati siano indicati come primo campo OK

Funzionano da "padre" a "figlio", quindi modifiche alla tabella esterna non hanno effetti su

interna.

risposto 8 anni fa
LonelyWolf
X 0 X

verifica che le tabelle sono realmente innnodb:

[tt]show create table nome_tabella[/tt]

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

ok grazie risolto tutto...

Le tabelle del mio db (non quelle dell'esempio) sono di tipo INNODB, l'integrità referenziale viene rispettata.

Indi se in una tabella un record cambia ID o viene cancellatto fisicamente dal db, tutte le tabelle che "puntano" verso di essa con una FK se ne accorgono ed eseguono le istruzioni indicate (cioè "ON DELETE SET NULL ON UPDATE CASCADE").

Ho anche elaborato una "mega" query che elimina tutte le tabelle senza errori. Visto che, se elimino una tabella "puntata" da un'altra questa genera errore e visto che dovrei eliminare le FK in un modo strano (almeno da quanto appreso in giro per la rete si deve eseguire una query... non mi dilungo); ma se faccio l'inverso, il problema non si pone! ;)

grazie ^^

risposto 8 anni fa
larchitetto
X 0 X
Ho anche elaborato una "mega" query che elimina tutte le tabelle senza errori. Visto che, se elimino una tabella "puntata" da un'altra questa genera errore e visto che dovrei eliminare le FK in un modo strano (almeno da quanto appreso in giro per la rete si deve eseguire una query... non mi dilungo); ma se faccio l'inverso, il problema non si pone! Wink

Avrò capito male, ma non credo sia un'ottima idea modificare lo schema a runtime, non so quello che vuoi fare, ma delle tabelle temporanee dovrebbero andare più che bene.

:bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

azz mi son espresso un po' male io, e non ho ben capito quello che hai scritto tu... =)

allora vi chiedo un'altra cosa. ad esempio avete uno spazio web con un mysql e un solo DB già creato (e che non si può nè distruggere, nè modificare, nè crearni altri). immaginate che mettete su un una serie di tabelle come nel mio esempio precedente (indi InnoDB, FK, etc). trovate un errore e decidete di buttare tutto giù. bene: come fate ad elimiare ogni tabella una dopo l'altra (unica operazione consentita)?

io per "mega query" intendevo un unico drop di tutte le tabelle, tutto in un'unica query. prestando attenzione agli errori che si potrebbero generare in presenza delle FK. esempio del primo post: se facessi drop di "esterna" prima di "interna", mysql mi darà un errore; o no?

grazie ^^

risposto 8 anni fa
larchitetto
modificato 8 anni fa
X 0 X

prova con una DROP TABLE tabella1, tabella2, ...

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

prova con una DROP TABLE tabella1, tabella2, ...

 :bye:

eh ciò che dissi qualche post fa, prestando attenzione a come fo il drop, per non avere errori con le relative FK...

tutto risolto!

thx all

risposto 8 anni fa
larchitetto
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda