我将此作为我的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'
答案 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
语句,并确保它在begin
和end
内。
好的,现在我们有了更多信息,很明显你想要的是一个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_balance
,statement_description
,statement_currencytype
必须设置为某个默认值。 statement_modified_datetime
可以设置为当前时间。
here is a demo显示此过程有效。
我假设,因为没有描述您想要完成的任务,是否要在新帐户打开后设置声明?如果情况并非如此,请回到问题并描述您想要完成的任务,而不仅仅是向我们展示您正在尝试的内容。