Our main table, tblLink, will have its primary key as foreign in a few other tables too and one of the tables will be tblMainData which over time will be millions of rows.

We would like to maintain only 3 months of data based on the insert date in tblLink.

The rest we would like to purge and keep to generate history reports. What is the best mechanism to go about in this scenario? Below is how our table structures looks like.

```
CREATE TABLE IF NOT EXISTS `tblLink` (
  `linkID` int(5) NOT NULL,
  `compID` int(5) NOT NULL,
  `vehicleID` int(5) NOT NULL,  
  `deviceID` int(5) NOT NULL,
  `locationFromID` int(5) NOT NULL,
  `locationToID` int(5) NOT NULL,
  `employeeIDInsert` int(5) NOT NULL,
  `dateTimeInsert` datetime NOT NULL,
  `dateTimeStartJourney` datetime NOT NULL,
  `dateTimeEnd` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `dateTimeEndJourney` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',   
  `linkStatus` enum('a','d','e','m') NOT NULL,
  PRIMARY KEY (`linkID`)  
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `tblEmailLog` (
  `emailLogID` int(11) NOT NULL AUTO_INCREMENT,
  `compID` smallint(6) NOT NULL,
  `linkID` int(11) NOT NULL DEFAULT '0',
  `userID` smallint(6) NOT NULL,
  `alertCodeID` tinyint(4) NOT NULL,
  `eventAlertID` int(11) NOT NULL,
  `userEmail` varchar(100) NOT NULL,
  `alertDateTime` datetime NOT NULL,
  `alertInsertDateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`emailLogID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `tblEventAlert` (
  `eventAlertID` int(11) NOT NULL AUTO_INCREMENT,
  `compID` int(5) NOT NULL,
  `mainDataID` int(5) NOT NULL,
  `vehicleID` int(5) NOT NULL,
  `eventAlertSentEmail` varchar(50) DEFAULT NULL,
  `eventAlertMessage` varchar(255) NOT NULL,
  PRIMARY KEY (`eventAlertID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `tblMainData` (
  `mainDataID` int(11) NOT NULL AUTO_INCREMENT,
  `linkID` int(5) NOT NULL,
  `header` varchar(3) NOT NULL,
  `deviceSerialNumber` varchar(20) NOT NULL,
  `latitude` double NOT NULL,
  `longitude` double NOT NULL,
  `speed` float NOT NULL,
  `course` int(3) NOT NULL,
  `dateTimer` datetime NOT NULL,
  `gpsDateTime` datetime NOT NULL,
  `insertDateTime` datetime NOT NULL,
  `odoMeter` float NOT NULL DEFAULT '0',
  `driverID` int(5) NOT NULL, 
  `eventAlertID` int(11) NOT NULL DEFAULT '0',
  `mainDataInsertDateTime` datetime NOT NULL,
  `gpsString` varchar(450) NOT NULL,
  PRIMARY KEY (`mainDataID`),
  KEY `dateTime` (`dateTimer`),
  KEY `linkID` (`linkID`),  
  KEY `eventAlertID` (`eventAlertID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `tblSubData` (
  `subDataID` int(11) NOT NULL AUTO_INCREMENT,
  `mainDataID` int(11) NOT NULL,
  `linkID` int(11) NOT NULL,
  `eventAlertID` int(11) NOT NULL,
  `deviceSerialNumber` varchar(20) NOT NULL,
  `subdeviceSerialNumber` varchar(20) NOT NULL,
  `dateTimer` datetime NOT NULL,
  `eventType` varchar(2) NOT NULL
  PRIMARY KEY (`subDataID`),
  KEY `mainDataID` (`mainDataID`),
  KEY `linkID` (`linkID`),
  KEY `eventAlertID` (`eventAlertID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

```