InnoDB

Salve

Io so che le tabelle in stila InnoDB supportano le foregin key.

Io sto utilizzando la versione 5.0.18-win32 di MySQL e facendo alcune prove ho notato che quando creo le

tabelle contenenti  chiavi esterne,se non dichiaro alla fine  TYPE=InnoDB,il sistema non mi da errori,cioè crea

correttamente le tabelle.

In questo modo come faccio a sapere se veramente si è tenuto conto delle chiavi esterne?O devo dichiarare

sempre TYPE=InnoDB alla termine della creazone della tabella contententi chiavi esterne?

Come si verifica se la tabella InnoDB è attivata?

Vi sarei proprio grato se mi rispondeste...

Arrivederci

inviato 10 anni fa
flaky
X 0 X

Se non definisci il tipo ti vengono create tabelle MyISAM (tipo di default), il che sigifica bye bye foreign key (anche se le hai dichiarate il sistema non le considera!!).

 A me è capitato lo stesso e l'unico modo in cui me ne sono accorto è stato quando eliminato una tupla con vincolo di chiave!! Comunque il tpo lo riconosci se effettui un backup o da phpMyAdmin->operazioni.

 :bye:

risposto 10 anni fa
Nico Colonna
X 0 X

Innanzitutto grazie della risposta fred.

Cmq visto che sono alle prime armi ti chiedo come si fa il backup per vedere il tipo di tabella.Io le tabelle le creo direttamente dal prompt dei comandi di MySQL(nn ho usato  phpMyAdmin).

.

risposto 10 anni fa
flaky
modificato 10 anni fa
X 0 X

Ciao Gianni.

Innazitutto grazie della risposta che mi hai dato.

Io ho provato la query:

1) show table status from nome_del_ db e mi ha dato come risultato la tabella MyISAM(+ di una volta).

e la query:

2) show variables like 'table_type'       che mi ha dato come risultato il tipo di tabella di default  InnoDB.

InnoDB si usa come supporto alle foreign key!Ma la tabella di tipo MyISAM a cosa serve e quando si usa?

Ringrazio  in anticipo chiunque mi risponda a questa domanda.

Arrivederci.

risposto 10 anni fa
flaky
modificato 10 anni fa
X 0 X

Mi correggo: per ricavare il tipo di tabella usato di default dei usare la query

SHOW TABLE TYPES

e cercare la riga che contiene "DEFAULT"

Le tabelle MyISAM sono più performanti delle InnoDB e sono presenti in MySQL dalle prime versioni.

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Grazie di nuovo per  la risposta Gianni.

La tabella di default è InnoDB.Quindi se mi serve una tabella MyISAM,basta che

lo indico alla fine della creazione di una tabella.

Vorrei farti una domanda sulla violazione dei vincoldi di integrità referenziale,per quanto riguarda l'operazione di modifica.

Supponiamo di avere queste due tabelle:

create table film

(

    titolo varchar(50) not null primary key,

    genere varcha(15) not null,

  )TYPE=MyISAM;

create table proiezione(

codicepr  decimal(4) not null primary key,

film varchar(50) not null

             references film(titolo)

                on update cascade

);

Ora la politica cascade dice che il nuovo valore dell'attributo della tabella esterna(film) viene riportatato su tutte le corrispondenti righe dellla tabella interna(proiezione).

Ora  non ho capito questo:  l'istruzione 'on update cascade'  serve solo per

dichiarare una violazione di un  vincolo( e quindi se il vincolo viene violato il

sistema ti avverte dell'errore) oppure  se cambio un titolo da film(direttamente dal prompt dei comandi mysql)

per esempio :

tabella film

----------------------------|-------------------|

  tiotolo                       |  genere

----------------------------|-------------------|

il signore degli anelli   | avventura

----------------------------|-------------------|

vizi di famiglia             |commedia

----------------------------|-------------------|

tabella proiezione

--------------------|---------------------------|

codicepr            |   film                         |

--------------------|---------------------------|

  1001               | il signore degli anelli |

--------------------|---------------------------|

  1002               | vizi di famiglia           |

--------------------|---------------------------|

se modifico nella tabella film il titolo:

        update film set titolo=' KING KONG' where titolo='vizi di famiglia'

automaticamente nella tabella proiezione al posto di  film='vizi di famiglia' mi va a mettere 'KING KONG'?

Sinceramente io ho provato quest'ultima e nn ha funzionato,e se cambio il nome direttamente in proiezione,mi sostituisce il nome in tutte le righe (anche quelle non coinvolte) cioè:

--------------------|---------------------------|

codicepr            |   film                          |  Tabella proieizone

--------------------|---------------------------|

  1001               | KING KONG               |

--------------------|---------------------------|

  1002               | KING KONG               |

--------------------|---------------------------|

Comunque come si può capire non mi è molto chiaro  l'uso di 'on update cascade'..

Spero di ricevere una risposta...

Arrivederci

risposto 10 anni fa
flaky
X 0 X

In teoria la variazione dell'attributo nella tabella principale (film) dovrebbe ripercuotersi (cascade) sulla tabella secondaria (proiezione). Questo in teoria!! In pratica non so!  ::)

 :bye:

risposto 10 anni fa
Nico Colonna
X 0 X

Perché hai dichiarato la tabella "film" come MyISAM?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ho dichiarato film di tipo MyIsam,perchè la tabella di default del mysql risulta InnoDB che vorrei usare solo per le tabelle in sui sono dichiarate chiavi esterne.

Ho fatto male?..

risposto 10 anni fa
flaky
X 0 X

Fred,come ho scritto nel msg io ci ho provato.

Dopo aver inserito tuple in entrambe le tabelle, per vedere come funzionava

l'istruzione 'on update cascade',ho modificato un titolo in FILM.

Poi son andata a  vedere nella tabella proiezione se il titolo del film

modificato nella tabella FILM era stato modificato automaticamente(ovviamente

nelle righe corrispondenti) ,ma nulla.La tabella non è stata proprio modificata.

Figurati che poi  ho optato di toccare direttamente nella tabella  proiezione

l'attributo film,e se non indico nella clausola Where il codicepr associato a quel

film,mi cambia il nome a tutte le righe..

Io dovrei fare un progetto,però sto perdendo molto tempo solo con il mysql...

Cmq grazie  anche a te  fred.

ciao

risposto 10 anni fa
flaky
X 0 X

Fai in modo che entrambe le tabelle siano InnoDB e riprova.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Grazie Gianni.

Adesso funziona!

Senti Gianni però se scrivo :

create table proiezione(film varchar(50) not null

                                           references film(titolo)

                                             on update cascade

                                             on delete set null

)

Se aggiungo on delete set null mi da errore.

Come mai?

Senti Gianni quando si usa la notazione auto_increment

ad esempio:

create table nome

(

     id integer not null auto_increment primary key

)

auto_increment cosa indica?Aumenta automaticamente di una unita(ad esempio se id=1,al passo successivo lo porta automaticamente a  id=2)?

Ciao

risposto 10 anni fa
flaky
modificato 10 anni fa
X 0 X

L'errore per la clausola "on delete set null" potrebbe essere causato dal fatto che il campo è (forse) una chiave primaria.

L'autoincrement è un campo che, se non specificato in una insert, viene automaticamente inserito con un valore na unità superiore al più alto valore della colonna.

Per tutte le info su MySQL ti consiglio comunque di rifarti alla documentazione ufficiale:

http://dev.mysql.com/doc/

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

ciao a tutti.

Il problema che ho è il seguente:

Ho creato tutte el tabelle direttamente tramite il prompt dei comandi di MySQL,e ho utilizzato come script il DEV-php.

Ora vorrei vedere se quel pezzo di codice funziona,cioè se mi da come risultato quello che ho richiesto,solo

che non so come farlo interagire con le tabelle del MYSQL(versione 5.0.18-win32) in cui ho inserito i dati.

Me lo sapreste dire?

Arrivederci

risposto 10 anni fa
flaky
X 0 X

Devi rispettare il regolamento, punto 8

http://www.phpnews.it/forum/index.php?topic=77.0

:chiuso:

P.S.: se vorrai aprire una nuova discussione, cerca di spiegare in dettaglio il problema.

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda