因此,我创建了这个存储过程,在向数据库实施新行之前,我检查了包含值的行是否已经存在。如果该行已存在,我返回该行的现有 ID,否则返回新创建的行 ID。
存储过程是:
BEGIN
DECLARE TestJobExists int;
SELECT id into TestJobExists FROM TestJob
WHERE `JobLink` = JobLink AND `StartTime` = StartTime
AND `Endtime` = Endtime
AND `Owner` = Owner_info AND `Engine` = Engine_info
AND (`TestSuiteId` = TestSuiteId or `TestSuiteId` is NULL)
AND (`TestSuiteCollectionId` = TestSuiteCollectionId or
`TestSuiteCollectionId` is NULL)
AND `Finished` = Finished AND `JenkinsBuild` = JenkinsBuild
AND `JenkinsJobName` = JenkinsJobName;
-- Set values to NULL if we have an empty string (we allow either null or ints)
IF TestSuiteId = '' THEN
SET TestSuiteId = null;
END IF;
IF TestSuiteCollectionId = '' THEN
SET TestSuiteCollectionId = null;
END IF;
IF TestSuiteCollectionId != '' THEN
SET TestSuiteId = null;
END IF;
-- If we have found an ID it should be above or equal to 1 else insert new row
IF TestJobExists >= 1 THEN
SELECT TestJobExists AS LastInsertId;
ELSE
INSERT INTO TestJob
(`id`,`JobLink`,`StartTime`,`Endtime`,`Owner`,`Engine`,`TestSuiteId`,`TestSuiteCollectionId`,`Finished`,`JenkinsBuild`,`JenkinsJobName`)
VALUES (NULL, JobLink, StartTime, Endtime, Owner_info, Engine_info, TestSuiteId, TestSuiteCollectionId, Finished, JenkinsBuild, JenkinsJobName);
SELECT LAST_INSERT_ID() AS LastInsertId;
END IF;
END
TestJobExists
将设置为现有 ID,如果不存在则设置为 null。如果不存在,我们插入一个新行。
我尝试运行 SQL 查询,但它只返回一行:
SELECT id into TestJobExists FROM TestJob
WHERE `JobLink` = "https://www.test.com"
AND `StartTime` = "2022-05-02 08:36:07"
AND `Endtime` = "2022-05-02 09:24:23"
AND `Owner` = "" AND `Engine` = "Tap"
AND (`TestSuiteId` = "" or `TestSuiteId` is NULL)
AND (`TestSuiteCollectionId` = "462" or `TestSuiteCollectionId` is NULL)
AND `Finished` = "SUCCESS" AND `JenkinsBuild` = "537"
AND `JenkinsJobName` = "VTU";
但是当我使用完全相同的值调用存储过程时,它说它不能返回超过一行:
CALL CreateTestJob("https://www.test.com","2022-05-02 08:36:07","2022-05-02 09:24:23","","Tap","","462","SUCCESS","537","VTU")
那么为什么当我自己运行它时它会返回一行,而当它在存储过程中时它为什么会返回多行?
我的猜测是,这与我对如何使用它或 SQL 搜索
(TestSuiteId = "" or TestSuiteId is NULL) AND (TestSuiteCollectionId = "462" or TestSuiteCollectionId is NULL)
行的方式的理解有关 DATETIME
StartTime = "2022-05-02 08:36:07" AND Endtime = "2022-05-02 09:24:23"
这就是桌子的样子:
Table: testjob
Columns:
id int(11) AI PK
Timestamp timestamp
JobLink varchar(300)
JobNo int(11)
StartTime datetime
EndTime datetime
Owner varchar(45)
Engine varchar(100)
TestSuiteId int(11)
TestSuiteCollectionId int(11)
Finished varchar(45)
JenkinsBuild int(100)
JenkinsJobName varchar(100)
LogTimestamp varchar(45)
JobVerdict varchar(45)
logText longtext
FlagStatus int(11)
Delete int(11)
Manuel int(11)
最后在浏览此链接和多次搜索后发现这对我有用。 将其添加到 sp 的开头。 设置全局 log_bin_trust_function_creators = 0;