trigger e delete | Tips & Tricks

Topic: Pubblico - Composto da 9 Posts di 2 Utenti.

04 Aprile, 2011 09:33 #1
fumocamel
Utente

fumocamel
Registrato: Apr, 2011
Posts: 10
Offline

ho due tabelle
una relazionata all'altra

tipo
tabella 1
ID
titolo

tabella 2
ID
IDrifTabella1
descrizione

vorrei fare un trigger che quando cancello una riga sulla tabella 1
mi cancella in automatico le righe relative della tabella 2

grazie

04 Aprile, 2011 10:25 #2
john_revelator
Moderatore

john_revelator
Registrato: Jun, 2009
Posts: 270
Offline

Ciao e benvenuto. Non è necessario ricorrere ai trigger.
L'engine innodb supporta la clausola on delete cascade per questo tipo di esigenze.

Ti posto il link del manuale con tanto di esempio

http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

Se dovessi avere difficoltà chiedi pure.


No PVT tecnici. Non rispondo nemmeno. Usate il forum.
My SO profile

04 Aprile, 2011 11:46 #3
fumocamel
Utente

fumocamel
Registrato: Apr, 2011
Posts: 10
Offline

grazie sto provando a fare un alter table
tutte e due le tabelle ora sono innodb

esistono 2 tabelle
gldgestionecontratti
che ha come primary key il campo RecId

e poi
gldpasseggericontratto
che ha come primary key il campo RecId
e come chiave Rifgldgestionecontratti con il nome Rifgldgestionecontratti

provo con questa alter

1alter table gldpasseggericontratto add constraint `FK_gldpasseggericontratto2` FOREIGN KEY (`Rifgldgestionecontratti`) REFERENCES `gldgestionecontratti` (`RecId`) ON DELETE CASCADE

e mi ritorna il seguente errore

1Cannot add or update a child row: a foreign key constraint fails (`/#sql-5db8_cc9`, CONSTRAINT `FK_gldpasseggericontratto` FOREIGN KEY (`Rifgldgestionecontratti`) REFERENCES `gldgestionecontratti` (`RecId`) ON DELETE CASCADE)

04 Aprile, 2011 11:49 #4
john_revelator
Moderatore

john_revelator
Registrato: Jun, 2009
Posts: 270
Offline

Esegui

1show create table nome_tabella

per entrambe e posta l'output prodotto per ciascuna.


No PVT tecnici. Non rispondo nemmeno. Usate il forum.
My SO profile

04 Aprile, 2011 11:55 #5
fumocamel
Utente

fumocamel
Registrato: Apr, 2011
Posts: 10
Offline

CREATE TABLE `gldpasseggericontratto` (
`RecId` varchar(30) NOT NULL,
`Rifgldgestionecontratti` varchar(30) default NULL,
`cognome` varchar(100) default NULL,
`nome` varchar(50) default NULL,
`sesso` enum('M','F','C') default NULL,
`indirizzo` varchar(50) default NULL,
`Cap` varchar(10) default NULL,
`Comune` varchar(100) default NULL,
`Provincia` varchar(2) default NULL,
`nazione` varchar(50) default NULL,
`telefono` varchar(50) default NULL,
`email` varchar(50) default NULL,
`allegadocumento` varchar(30) default NULL,
`numeropassaporto` varchar(30) default NULL,
`stamparicevuta` enum('0','1') default '0',
`Creator` varchar(30) default NULL,
`Created` timestamp NULL default NULL,
`Modified` datetime default NULL,
PRIMARY KEY (`RecId`),
KEY `Creator` (`Creator`),
KEY `Rifgldgestionecontratti` (`Rifgldgestionecontratti`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

04 Aprile, 2011 11:56 #6
fumocamel
Utente

fumocamel
Registrato: Apr, 2011
Posts: 10
Offline

CREATE TABLE `gldgestionecontratti` (
`RecId` varchar(30) NOT NULL,
`unitater` varchar(30) default NULL,
`statocontratto` varchar(30) default NULL,
`statoservizi` varchar(30) default NULL,
`ncontratto` varchar(10) default NULL,
`datacontratto` date default NULL,
`soggcode` varchar(30) default NULL,
`Rifgldanagrafica` varchar(30) default NULL,
`soggcodefatt` varchar(30) default NULL,
`Rifgldanagraficafatt` varchar(30) default NULL,
`destinazione` varchar(255) default NULL,
`n_passeggeri` int(11) default NULL,
`datapartenza` date default NULL,
`dataarrivo` date default NULL,
`pagareentro` date default NULL,
`n_giorni` int(11) default NULL,
`nnotti` int(11) default NULL,
`totaleimportocontratto` double NOT NULL,
`totaleimportopagato` double NOT NULL,
`totaleimportodapagare` double default NULL,
`sconto` double default NULL,
`totalenetto` double default NULL,
`tipooperazioneiva` varchar(30) default NULL,
`ricevutafiscale` varchar(30) default NULL,
`fatturata` varchar(30) default '',
`rifgldregistrazionicontabili` varchar(30) default NULL,
`note` text,
`cc` varchar(30) default NULL,
`Creator` varchar(30) default NULL,
`Created` timestamp NULL default NULL,
`Modified` datetime default NULL,
PRIMARY KEY (`RecId`),
KEY `Creator` (`Creator`),
KEY `statocontratto` (`statocontratto`),
KEY `fatturata` (`fatturata`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

04 Aprile, 2011 12:12 #7
john_revelator
Moderatore

john_revelator
Registrato: Jun, 2009
Posts: 270
Offline

Annulla temporaneamente la verifica dei vincoli

1set foreign_key_checks = 0;
2alter table gldpasseggericontratto add constraint `FK_gldpasseggericontratto2` foreign key (`Rifgldgestionecontratti`) references `gldgestionecontratti` (`RecId`) on delete cascade;
3set foreign_key_checks = 1;

e vedi se così risolvi.


No PVT tecnici. Non rispondo nemmeno. Usate il forum.
My SO profile

04 Aprile, 2011 14:12 #8
fumocamel
Utente

fumocamel
Registrato: Apr, 2011
Posts: 10
Offline

ok
grazie 1000
funziona perfettamente!!!

04 Aprile, 2011 14:42 #9
john_revelator
Moderatore

john_revelator
Registrato: Jun, 2009
Posts: 270
Offline

Di nulla. Ciao!


No PVT tecnici. Non rispondo nemmeno. Usate il forum.
My SO profile

Condividi su:

Loggati o Registrati per replicare