Salve ragazzi.
Devo creare un'applicazione che permetta a degli scrittori in erba di scrivere dei libri online; ebbene l'applicazione si appoggia ad un database che deve essere formato così:
tabella autore (generalità e ovviamente una chiave primaria A_ID)
tabella libro (titolo del libro e una chiave primaria L_ID)
capitoli (titolo del capitolo, corpo del capitolo, chiave primaria C_ID)
una tabella di interscambio delle chiavi primarie che tenga conto delle associazioni tra libri e autori e ovviamente dei capitoli associati al libro.
ebbene tutto sembra funzionare in principio ma poi tenuto conto che se cancellando un libro dall'elenco venivano effettivamente cancellati tutti i riferimenti all'autore e ai capitoli nella tabella di scambio, però nella tabella dei capitoli questi ovviamente rimangono.
Ora questo fa si che ogni volta un autore cancelli il suo libro (fatti suoi no?) mi si riempia il database di capitoli senza un riferimento al libro e al suo autore.
Per cancellarli devo necessariamente fare più query in modo da sapere a quale libro si si riferiscono e cancellarli per "sistemare il casino".
La strada veloce potrebbe essere quella di realizzare una chiave esterna anche nei capitoli e che punti al libro di riferimento, in modo che leggendo quel riferimento se il libro non esiste più, cancello il capitolo, ma appena ci ho provato il database nemmeno mi si installava dandomi un errore di constrait e riferimenti incrociati.
questo un estratto dell'installatore del database.
Qualcuno mi sa aiutare?DROP TABLE IF EXISTS Account;
CREATE TABLE Account (
A_Id int NOT NULL AUTO_INCREMENT,
PRIMARY KEY (A_Id),
nickname varchar(20) NOT NULL,
password varchar(40) NOT NULL,
salt varchar(40) NOT NULL,
email varchar(63) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
DROP TABLE IF EXISTS Titolo;
CREATE TABLE Titolo (
T_Id int NOT NULL AUTO_INCREMENT,
A_Id int NOT NULL,
titolo varchar(255) NOT NULL,
PRIMARY KEY (T_Id, A_Id),
FOREIGN KEY (A_Id) REFERENCES Account(A_Id)
ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
DROP TABLE IF EXISTS Capitolo;
CREATE TABLE Capitolo (
C_Id int NOT NULL AUTO_INCREMENT,
titolo varchar(255) NOT NULL,
paragrafo text NOT NULL,
PRIMARY KEY (C_Id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
DROP TABLE IF EXISTS tbl_TitoloCapitolo;
CREATE TABLE tbl_TitoloCapitolo (
A_Id int NOT NULL,
T_Id int NOT NULL,
C_Id int NOT NULL,
PRIMARY KEY (A_Id, T_Id, C_Id),
FOREIGN KEY (A_Id) REFERENCES Account(A_Id)
ON DELETE CASCADE ON UPDATE RESTRICT,
FOREIGN KEY (T_Id) REFERENCES Titolo(T_Id)
ON DELETE CASCADE ON UPDATE RESTRICT,
FOREIGN KEY (C_Id) REFERENCES Capitolo(C_Id)
ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

Rispondi quotando