[sanniolug] Re: Chiavi esterne e MySQL (lungo)

  • From: mick <mickoz@xxxxxx>
  • To: sanniolug@xxxxxxxxxxxxx
  • Date: Tue, 16 Sep 2003 16:32:16 +0200

Bepp0 wrote:

Ciò vuol dire che con relazioni MyISAM non potrò "godere" ;-)
> dei vantaggi derivanti dalle dichiarazioni
FOREIGN KEY (vedi integrità referenziale e altro)?
Cioè: devo cambiare il formato delle mie tabelle in InnoDB o posso
> procedere con MyISAM?



Ciao Peppì.
Allora, ti rispondo qui perché oggi a mensa non c'era sufficiente tranquillità e non avevo sottomano la documentazione.
Se sei certo che ti serva l'integrità referenziale devi usare le tabelle di tipo InnoDB, che sono leggermente più lente delle velocissime MyISAM.
Le MyISAM non supportano l'integrità referenziale per una scelta legata alla velocità di funzionamento di MySQL che è un database che predilige la leggerezza e la velocità di esecuzione.
Ergo, MyISAM è il tipo di tabella che ti serve se hai fretta ;-))


Torniamo ad InnoDB. Hai deciso che ti serve quello e vuoi sapere come fare:
come puoi leggere da http://www.mysql.com/doc/en/Nutshell_4.0_features.html la versione 4.X.XX supporta in pieno il tipo InnoDB che viene dato come "standard feature".


Io ti consiglio di non usare ALTER TABLE per trasformare la tua tabella MyISAM in InnoDB ma ricorrere agli script. Visto che MOMENTANEAMENTE stai lavorando sotto Windows, ecco cosa dovrai fare:

C:\MYSQL\BIN\> mysqldump nome_database -u utente -ppassword --opt
                                -ppassword > il_mio_dump.sql
(tutto su una stessa linea)

Ricorda quello che ti ho detto oggi: la password forniscila da riga di comando, altrimenti quell'imbecille di Windows redigerà a il_mio_dump.sql anche la richiesta della password...... Lasciamm' perdere.... =))


A questo punto leggiti il file il_mio_dump.sql (che è un normalissimo file di testo). Sotto la creazione della tabella c'è una voce che dichiara il tipo della tabella. Eccoti un esempio da uno dei miei db:


DROP TABLE IF EXISTS benefici;
CREATE TABLE benefici (
  id_beneficio int(10) unsigned NOT NULL default '0',
  id_comune int(10) unsigned NOT NULL default '0',
  frazione varchar(50) default NULL,
  beneficio varchar(50) NOT NULL default '',
  PRIMARY KEY  (id_beneficio),
  KEY id_comune (id_comune)
) TYPE=MyISAM;

Come puoi vedere, sotto la dichiarazione delle chiavi c'è il tipo di tabella che ho creato. Sostituisci "MyISAM" con "InnoDB".
Ricordati di dichiarare tutte le "foreigner keys" e apporta tutte le altre modifiche che ritieni necessario.
A questo punto dai:


C:\MYSQL\BIN\> mysql database -u utente -ppassword <
                                        il_mio_dump_modificato.sql

Se tutto va bene non ci sarà nessun messaggio di errore =)


Per l'uso dell'integrità referenziale dai uno sguardo qui: http://www.mysql.com/doc/en/InnoDB_foreign_key_constraints.html

Ti viene spiegato come impostare le regole per decidere cosa fare nel caso di cancellazione della foreigner key.

Spero di averti tolto i dubbi. Buon lavoro! =))

Nico



--
mickoz
Registered Linux User #319941
http://counter.li.org




Other related posts:

  • » [sanniolug] Re: Chiavi esterne e MySQL (lungo)