foreign key

Tianie-Finn

Nuovo Utente
11 Giu 2009
6
0
0
Ciao a tutti,
è il primo lavoro con mysql che provo a fare.. specifico che come tools sto usando il mysql query browser.. Il mio problema è con la foreign key.. penso che la sintassi sia corretta.. ma mi dice che non può creare la tabella e da errore errno150.
Il codice che ho scritto è questo:

CREATE TABLE DatiAnagrafici(
cartellaclinica varchar(5) NOT NULL default '',
PRIMARY KEY (cartellaclinica)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE EsameObiettivo(
id char(5) primary key,
ks_datianagrafici varchar(5) NOT NULL,
foreign KEY (ks_datianagrafici) references DatiAnagrafici(cartellaclinica) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=innodb;

l'errore me lo da quando provo a creare la seconda tabella..
qualcuno sa dirmi come poter risolvere questo errore?
Grazie
 
ciao, anche se in ritardo e non essendo un esperto, ma da quello che ho capito entrambe le tabelle dovrebbero essere innodb

prova, al massimo non funzia
 
ciao scusa, ho ritrovato il testo del mauale, te lo posto

Con le tabelle InnoDB possiamo definire le foreign key, cioè collegare i valori delle colonne che contengono chiavi di altre tabelle alle tabelle stesse. In questo modo è possibile verificare automaticamente quando i valori della tabella madre vengono modificati o eliminati in modo da impedire queste modifiche o, al contrario, modificare di conseguenza anche i valori sulla tabella figlia. Inoltre non è possibile inserire nella tabella figlia valori che non hanno un corrispondente nella tabella madre. Vediamo un esempio di definizione:
CREATE TABLE madre(id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE figlia(id INT, madre_id INT,
INDEX par_ind (madre_id),
FOREIGN KEY (madre_id) REFERENCES madre(id)
ON DELETE CASCADE
) ENGINE=INNODB;
In questo codice vediamo definite due tabelle nelle quali la tabella figlia ha una foreign key sulla tabella madre. Quando viene cancellata una riga dalla tabella madre, se il valore di id è presente in un campo madre_id della tabella figlia la riga corrispondente viene anch'essa eliminata. Entrambe le tabelle devono essere di tipo InnoDB; entrambe le colonne devono figurare come primo campo di un indice.
È possibile dare un nome alla relazione specificando "CONSTRAINT nome" prima di FOREIGN KEY. Tale nome sarà poi utilizzabile qualora si decida di eliminare la FOREIGN KEY, con la sintassi "ALTER TABLE tabella DROP FOREIGN KEY nome".
Qualora il nome non venga indicato, sarà creato in automatico dal server e visualizzabile attraverso "SHOW CREATE TABLE tabella".
Nell'esempio abbiamo visto l'indicazione della clausola ON DELETE per gestire le cancellazioni sulla chiave esterna referenziata; allo stesso modo è possibile utilizzare ON UPDATE per gestire gli aggiornamenti. Entrambe le opzioni accettano come valori possibili uno dei seguenti: CASCADE, SET NULL, RESTRICT, NO ACTION.
Con il primo, come abbiamo visto, le modifiche sulla tabella madre vengono riportate sulla tabella figlia. Con SET NULL gli eventuali valori presenti nella tabella figlia vengono impostati a NULL (la definizione della colonna lo deve consentire). Le ultime due equivalgono a non indicare la clausola e comportano il rifiuto della modifica sulla tabella madre.
In una tabella InnoDB non è possibile utilizzare indici FULLTEXT, e le colonne di tipo geometrico sono disponibili solo a partire dalla versione 5.0.16.
Per le colonne AUTO_INCREMENT deve esistere un indice di cui siano l'unico componente.
 

Discussioni simili