Ciao a tutti,
Stò creando un piccolo database con sqlite, mi trovo questo problema.
Con MySQL creando una tabella così:
CREATE TABLE contatti(
idcontatto INT auto_increment,
idfornitore INT NOT NULL,
contatto varchar(40),
notecontatto varchar(80),
PRIMARY KEY idcontatto (idcontatto),
INDEX fornitori_key (idfornitore),
FOREIGN KEY (idfornitore) REFERENCES fornitori(idfornitore)
ON DELETE CASCADE
ON UPDATE CASCADE)
TYPE=InnoDB;
..cancellando il fornitore mi cancella in automatico tutti i contatti legati a quel id fornitore.
Come si fà con sqlite?
Ciao grazie
Nel mio programma che iniziai a far con codeblocks e poi abbandonai facevo cosí:
dalla linea di comando mi creo il database
SQLITE3 prezzario.db3
creo le tabelle:
CREATE TABLE [costi] (
[id_costo] INTEGER PRIMARY KEY NOT NULL,
[cod_costo] VARCHAR(40) UNIQUE NOT NULL,
[descr_costo] VARCHAR(255) NOT NULL,
[costo_unit] REAL NOT NULL,
[genere] VARCHAR(40) NOT NULL,
[unmis] VARCHAR(40) NOT NULL
);
CREATE TABLE [analisi] (
[id_an] INTEGER NOT NULL PRIMARY KEY,
[articolo] VARCHAR(255) NOT NULL,
[cod_costo] VARCHAR(40) NOT NULL,
[resa] REAL,
[costo] REAL
);
creo i triggers rispettivamente sulle operazioni di insert, update e delete:
CREATE TRIGGER edit_analisi before insert on analisi
for each row
begin
select case
when
(
(new.cod_costo is not null)
and
(
((select cod_costo from costi where
cod_costo =new.cod_costo) is null)
)
)
then raise(abort,'violacion integridad')
end;
end;
CREATE TRIGGER upd_analisi before update on analisi
for each row begin
select case
when
(
((select cod_costo from costi where
cod_costo = new.cod_costo) is null)
)
then raise(abort,'violacion integridad')
end;
end;
CREATE TRIGGER delete_costo before delete on costi
for each row begin
select case
when
((select cod_costo from analisi
where cod_costo = old.cod_costo) is not null)
then raise(abort,'violacion integridad')
end;
end;
Spero che possa esserti utile
grazie Ceskho
@Golia
prova con
CREATE TRIGGER cancellatutto
BEFORE DELETE ON costi
FOR EACH ROW BEGIN
DELETE from analisi WHERE cod_costo = OLD.cod_costo;
END;
Cosí cancellando un record di costi si cancellano tutte le analisi con lo stesso cod_costo.
Il trigger precedente delete_costo fa l'opposto di quello che mi hai chiesto, ossia impedisce cancellare un costo se sono presenti analisi che lo utilizzano, quindi dovrai eliminarlo dal db, però è bene conoscerlo potrá servirti per altre tabelle.
Ti ringrazio, mi hai indicato la strada giusta :D
Ho fatto così
sql = "CREATE TABLE clienti ("
sql &= " idcliente INTEGER NOT NULL PRIMARY KEY,"
sql &= " 'nome' varchar(20) DEFAULT NULL"
sql &= " );"
hTable = $sqlitehConn.EXEC(sql)
sql = "CREATE TABLE preventivi ("
sql &= " idpreventivo INTEGER NOT NULL PRIMARY KEY,"
sql &= " idcliente_preventivi INTEGER,"
sql &= " 'descrizione' varchar(250) DEFAULT NULL"
sql &= " CONSTRAINT controllo_preventivi REFERENCES clienti(idcliente) ON DELETE CASCADE"
sql &= " );"
hTable = $sqlitehConn.EXEC(sql)
sql = "CREATE trigger controllo_preventivi"
sql &= " before DELETE ON clienti"
sql &= " FOR EACH row begin"
sql &= " DELETE FROM preventivi WHERE idcliente_preventivi = old.idcliente;"
sql &= " END ;"
hTable = $sqlitehConn.EXEC(sql)
Ciao grazie