使用触发器BEFORE UPDATE将行插入到第二个表

时间:2015-05-11 22:59:17

标签: mysql triggers

我将此作为我的pension_accounts表的表结构,并在我的第二个表pension_statement表的结构下面,以便从表pension_accounts中选择AFTER UPDATE触发器

Table structure for table `pension_accounts` 

CREATE TABLE IF NOT EXISTS `pension_accounts` (
  `User_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Title` varchar(500) NOT NULL,
  `Surname` varchar(500) NOT NULL,
  `Firstname` varchar(500) NOT NULL,
  `Other_names` varchar(500) NOT NULL,
  `DOB` varchar(500) NOT NULL,
  `Gender` varchar(500) NOT NULL,
  `MaritalStatus` varchar(500) NOT NULL,
  `City` varchar(500) NOT NULL,
  `State` varchar(500) NOT NULL,
  `Nationality` varchar(500) NOT NULL,
  `Country` varchar(500) NOT NULL,
  `Email` varchar(500) NOT NULL,
  `Mobile` varchar(500) NOT NULL,
  `Address` varchar(500) NOT NULL,
  `AccountType` varchar(500) NOT NULL,
  `PASSWORD` varchar(500) NOT NULL,
  `ACCOUNT_NUMBER` varchar(500) NOT NULL DEFAULT '',
  `CountryCode` varchar(500) NOT NULL,
  PRIMARY KEY (`User_id`),
  UNIQUE KEY `Surname` (`Surname`,`Firstname`,`PASSWORD`),
  UNIQUE KEY `Email` (`Email`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

DROP TRIGGER IF EXISTS `before_update_pension_accounts`;
DELIMITER //
CREATE TRIGGER `before_update_pension_accounts` BEFORE UPDATE ON `pension_accounts`
 FOR EACH ROW SET new.Modified_DateTime = CURRENT_TIMESTAMP
//
DELIMITER ;

AND SECOND TABLE`

pension_statement

的表结构
CREATE TABLE IF NOT EXISTS `statement` (
  `StatementID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Statement_Surname` varchar(500) NOT NULL,
  `Statement_Firstname` varchar(500) NOT NULL,
  `Statement_ACCOUNT_NUMBER` varchar(500) NOT NULL,
  `Statement_Balance` varchar(500) NOT NULL,
  `Statement_Modified_DateTime` varchar(500) NOT NULL,
  `Statement_Description` varchar(500) NOT NULL,
  `Statement_CurrencyType` varchar(500) NOT NULL,
  PRIMARY KEY (`StatementID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

问题: 我尝试向该触发器添加INSERT语句以将行插入pension_statement但它失败了;

DROP TRIGGER IF EXISTS `statement_history`;
DELIMITER //
CREATE TRIGGER `statement_history` AFTER UPDATE ON `pension_accounts`
 FOR EACH ROW INSERT INTO `pension_statement` (`StatementID`, `Statement_Surname`, `Statement_Firstname`, `Statement_ACCOUNT_NUMBER`, `Statement_Balance`, `Statement_Modified_DateTime`) VALUES (NULL, 'new.Statement_Surname', 'new.Statement_Firstname', 'new.Statement_ACCOUNT_NUMBER', 'new.Statement_Balance', 'new.Statement_Modified_DateTime')
//
DELIMITER ;

它回归这个价值观:

'new.Statement_Surname', 'new.Statement_Firstname', 'new.Statement_ACCOUNT_NUMBER', 'new.Statement_Balance', 'new.Statement_Modified_DateTime'

1 个答案:

答案 0 :(得分:1)

您可以在触发器中执行多个语句,方法是将其括在begin ... end块中。例如

DROP TRIGGER IF EXISTS `before_update_pension_accounts`;
DELIMITER //
CREATE TRIGGER `before_update_pension_accounts` BEFORE UPDATE ON `pension_accounts`
 FOR EACH ROW 
 BEGIN
   SET new.Modified_DateTime = CURRENT_TIMESTAMP;
   ... another statement here ... ;
   ... and another one ... ;
 END
//
DELIMITER ;

只需在insert语句后添加set语句,并确保它在beginend内。

好的,现在我们有了更多信息,很明显你想要的是一个after insert触发器。它应该是这样的:

CREATE TRIGGER `before_update_pension_accounts` after insert ON `pension_accounts`
FOR EACH ROW 
BEGIN
   insert into `statement` (statement_surname, statement_firstname, statement_account_number, statement_balance, statement_modified_datetime, statement_description, statement_currencytype) values(new.surname, new.firstname, new.account_number, 0, now(), 'something', 'something');
END//

您只能使用new前缀来引用此实例中pension_accounts表中的字段,这意味着statement_balancestatement_descriptionstatement_currencytype必须设置为某个默认值。 statement_modified_datetime可以设置为当前时间。

here is a demo显示此过程有效。

我假设,因为没有描述您想要完成的任务,是否要在新帐户打开后设置声明?如果情况并非如此,请回到问题并描述您想要完成的任务,而不仅仅是向我们展示您正在尝试的内容。