Code Bye

mysql触发器问题

 

表结构很简单
就两个属性
一个是id 主键
一个是md5id 
剩下的是其他属性

想要在插入表中数据时,md5id根据id自动生成
写了触发器如下
CREATE trigger tr2 BEFORE insert on projectbasicsituation for each row
begin
SET NEW.md5id = MD5(NEW.id);
end;

没有任何报错,但是插入数据时,没有产生md5id
感觉就是触发器没有起作用,改成SET NEW.md5id = ‘1’ 来测试,发现也没用

是什么原因?该怎么解决这个问题?

15分
贴出 show create table projectbasicsituation  以供分析。
估计是用的auto_incremet

问题说明越详细,回答也会越准确!参见如何提问。(提问的智慧

引用 1 楼 ACMAIN_CHM 的回复:

贴出 show create table projectbasicsituation  以供分析。
估计是用的auto_incremet

问题说明越详细,回答也会越准确!参见如何提问。(提问的智慧

CREATE TABLE `projectbasicsituation` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `applicationClass` varchar(100) DEFAULT NULL,
  `projectName` varchar(200) DEFAULT NULL,
  `projectCateName` varchar(100) DEFAULT NULL,
  `projectCateCode` varchar(50) DEFAULT NULL,
  `projectClass` varchar(255) DEFAULT NULL,
  `manageFieldName` varchar(50) DEFAULT NULL,
  `fillinDate` date DEFAULT NULL,
  `finishDate` date DEFAULT NULL,
  `projectAreaType` varchar(50) DEFAULT NULL,
  `projectAreaCode` varchar(50) DEFAULT NULL,
  `subjectName` varchar(50) DEFAULT NULL,
  `secondSubjectName` varchar(255) DEFAULT NULL,
  `referTechName` varchar(50) DEFAULT NULL,
  `applicationNo` varchar(50) DEFAULT NULL,
  `principalPersonName` varchar(50) DEFAULT NULL,
  `ppTel` varchar(100) DEFAULT NULL,
  `ppEmail` varchar(100) DEFAULT NULL,
  `ppFax` varchar(100) DEFAULT NULL,
  `workUnit` varchar(255) DEFAULT NULL,
  `bearerName` varchar(50) DEFAULT NULL,
  `cooperationName` varchar(100) DEFAULT NULL,
  `relationMan` varchar(50) DEFAULT NULL,
  `tel` varchar(50) DEFAULT NULL,
  `address` varchar(100) DEFAULT NULL,
  `postcode` varchar(20) DEFAULT NULL,
  `selfArrangement` float(20,4) DEFAULT NULL,
  `applicationCount` float(20,4) DEFAULT NULL,
  `projectExpendSum` float(20,4) DEFAULT NULL,
  `bankLoan` float(20,4) DEFAULT NULL,
  `projectExpendOther` float(20,4) DEFAULT NULL,
  `branch` float(20,4) DEFAULT NULL,
  `annualIncrease` float(20,4) DEFAULT NULL,
  `annualProfits` float(20,4) DEFAULT NULL,
  `annualTaxes` float(20,4) DEFAULT NULL,
  `annualEarnings` float(20,4) DEFAULT NULL,
  `annualSinks` float(20,4) DEFAULT NULL,
  `employment` float(20,4) DEFAULT NULL,
  `plantArea` float(20,4) DEFAULT NULL,
  `promotionArea` float(20,4) DEFAULT NULL,
  `papersNum` int(10) DEFAULT NULL,
  `patentNum` int(10) DEFAULT NULL,
  `patentsNum` int(10) DEFAULT NULL,
  `newPatentsNum` int(10) DEFAULT NULL,
  `achievementLevel` text,
  `taskSource` text,
  `acceptanceDate` date DEFAULT NULL,
  `acceptanceCompany` varchar(50) DEFAULT NULL,
  `projectType` text,
  `knowledgeRight` text,
  `technologyTrans` text,
  `socialBenefit` text,
  `state` int(10) DEFAULT NULL,
  `addUserTel` varchar(100) DEFAULT NULL,
  `addUserId` varchar(255) DEFAULT NULL,
  `addDate` date DEFAULT NULL,
  `submitDate` date DEFAULT NULL,
  `passDate` date DEFAULT NULL,
  `updateDate` date DEFAULT NULL,
  `backIdea` text,
  `office` varchar(100) DEFAULT NULL,
  `formId` int(10) DEFAULT NULL,
  `priority` tinyint(1) DEFAULT NULL,
  `commonAdminCode` varchar(100) DEFAULT NULL,
  `highAdminCode` varchar(100) DEFAULT NULL,
  `departmentCode` varchar(100) DEFAULT NULL,
  `superAdminCode` varchar(100) DEFAULT NULL,
  `administratorCode` varchar(100) DEFAULT NULL,
  `administrator` varchar(100) DEFAULT NULL,
  `toUserId` varchar(255) DEFAULT NULL,
  `version` varchar(100) DEFAULT NULL,
  `legalPerson` varchar(50) DEFAULT NULL,
  `legalPersonCode` varchar(50) DEFAULT NULL,
  `lpAddress` varchar(100) DEFAULT NULL,
  `lpEthnic` varchar(20) DEFAULT NULL,
  `lpPolitic` varchar(20) DEFAULT NULL,
  `lpSex` varchar(10) DEFAULT NULL,
  `lpAge` int(10) unsigned zerofill DEFAULT NULL,
  `lpEducation` varchar(255) DEFAULT NULL,
  `lpDuty` varchar(50) DEFAULT NULL,
  `lpTitle` varchar(255) DEFAULT NULL,
  `lpBir` date DEFAULT NULL,
  `lpPostDate` date DEFAULT NULL,
  `lpTel` varchar(20) DEFAULT NULL,
  `lpMobilePhone` varchar(20) DEFAULT NULL,
  `lpEmail` varchar(50) DEFAULT NULL,
  `lpResume` text,
  `bankAccount` varchar(255) DEFAULT NULL,
  `bank` varchar(255) DEFAULT NULL,
  `email` varchar(100) DEFAULT NULL,
  `fax` varchar(20) DEFAULT NULL,
  `mobilePhone` varchar(20) DEFAULT NULL,
  `similarity` float(20,4) DEFAULT NULL,
  `checkStep` int(4) DEFAULT NULL,
  `operate` int(4) DEFAULT NULL,
  `operator` varchar(100) DEFAULT NULL,
  `techField` varchar(255) DEFAULT NULL,
  `projectLevel` varchar(255) DEFAULT NULL,
  `patentMan` varchar(255) DEFAULT NULL,
  `patentManAddress` varchar(255) DEFAULT NULL,
  `patentManBank` varchar(255) DEFAULT NULL,
  `patentManbankAccount` varchar(255) DEFAULT NULL,
  `managerMan` varchar(255) DEFAULT NULL,
  `managerManTel` varchar(255) DEFAULT NULL,
  `KjjManagerMan` varchar(255) DEFAULT NULL,
  `mainFinishMen` varchar(1000) DEFAULT NULL,
  `otherQualification` text,
  `resultForm` varchar(255) DEFAULT NULL,
  `resultWords` int(10) DEFAULT NULL,
  `resultClass` varchar(255) DEFAULT NULL,
  `paperNumAndLv` varchar(255) DEFAULT NULL,
  `publishDate` date DEFAULT NULL,
  `publishName` varchar(255) DEFAULT NULL,
  `isSelfArrange` varchar(255) DEFAULT NULL,
  `isOfficePub` varchar(255) DEFAULT NULL,
  `resultDirection` varchar(255) DEFAULT NULL,
  `recommendUnit` varchar(255) DEFAULT NULL,
  `projectSupplement` varchar(2000) DEFAULT NULL,
  `teamNum` int(10) DEFAULT NULL,
  `highLevelNum` int(10) DEFAULT NULL,
  `middleLevelNum` int(10) DEFAULT NULL,
  `doctorNum` int(10) DEFAULT NULL,
  `keyword` varchar(50) DEFAULT NULL,
  `md5id` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=129 DEFAULT CHARSET=utf8

谢谢,没几次提问,没有详细说明,上面贴出了详情,自增长对触发器有影响吗?

BEFORE insert  中 auto_increment 还没有值。
引用 3 楼 ACMAIN_CHM 的回复:

BEFORE insert  中 auto_increment 还没有值。

非常感谢您的回答。
如果用after,我该怎么做呢?不要用max(id)这类的,要考虑到并发。

引用 3 楼 ACMAIN_CHM 的回复:

BEFORE insert  中 auto_increment 还没有值。

after触发器怎么获得写字段啊

SET NEW.md5id = MD5(NEW.id);

不能用new关键字,光写set md5id也无法识别,我怎么表示我要更改md5id这个字段?

引用 3 楼 ACMAIN_CHM 的回复:

BEFORE insert  中 auto_increment 还没有值。

如果我改成 
CREATE trigger tr2 AFTER insert on projectbasicsituation for each row
begin
UPDATE projectbasicsituation SET md5id = md5(id) WHERE id = MAX(id);
end;

服务器在插入时会报错
 Can””t update table “”projectbasicsituation”” in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

25分
CREATE trigger tr2 BEFORE insert on projectbasicsituation for each row
begin
DECLARE nextId INT(10);
SELECT AUTO_INCREMENT INTO nextId FROM information_schema.tables WHERE table_name="projectbasicsituation";
SET NEW.md5id = MD5(nextId);
end;

插入触发好像不能事后修改本表数据,所以只能在之前获取自增id。
方法是刚想的,所以不知道并发状态下是否会有问题。
我一般这种情况不写触发器,直接在代码中插入后获取插入id然后update的,楼主也可以考虑一下。

引用 7 楼 ayayad 的回复:
CREATE trigger tr2 BEFORE insert on projectbasicsituation for each row
begin
DECLARE nextId INT(10);
SELECT AUTO_INCREMENT INTO nextId FROM information_schema.tables WHERE table_name="projectbasicsituation";
SET NEW.md5id = MD5(nextId);
end;

插入触发好像不能事后修改本表数据,所以只能在之前获取自增id。
方法是刚想的,所以不知道并发状态下是否会有问题。
我一般这种情况不写触发器,直接在代码中插入后获取插入id然后update的,楼主也可以考虑一下。

谢谢回复,给我了很大的启发,测了下是可以的,非常感谢。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明mysql触发器问题