这是我的代码。我收到“IF NOT EXISTS ...”语句的语法错误。我想在这里做什么是非常明显的。如果记录存在于条款表中,我想知道唯一的term_id。如果记录不存在,我想插入一条新记录并获得后续声明中需要的唯一term_id。
如何在保留逻辑的同时在语法上正确地编写此语句。感谢。
INSERT INTO `koolkat_temp`.`creatives` (`creative_id`, `creative_title`, `creative_image_name`) VALUES (NULL, 'xyz', 'xyz');
SET @record_pointer = LAST_INSERT_ID();
IF NOT EXISTS (SELECT `term_id` INTO @term_id_placement FROM `terms` WHERE `name` LIKE 'xyz.com' and `taxonomy` LIKE 'placement') THEN
INSERT INTO `terms` (`term_id` ,`name` ,`slug`, `taxonomy`, `description` ,`parent`, `count`) VALUES (NULL, 'xyz.com', 'xyz.com', 'placement', '', 0, 0);
SET @term_id_placement = LAST_INSERT_ID();
ENDIF;
INSERT IGNORE INTO `term_relationships` (`creative_id` ,`term_id` ,`term_order`) VALUES (@record_pointer, @term_id_placement, 0);
答案 0 :(得分:1)
您可以将creatives
查询分解为三个更简单的查询(搜索术语ID,如果术语不存在则插入,插入creatives
),并将其包装,{{1}在事务内部,这将具有保持整个操作的原子性的好处,并且还将简化查询,从而更容易理解和维护。
一些事情(我使用伪代码,因为我不知道你用什么平台连接到mysql):
term_relationships
如果要保留服务器端,可以创建包含上述查询的存储过程。您可以配置存储过程以允许参数,从而可以轻松自定义查询。顺便提一下(原谅任何语法错误,我现在面前没有mysql):
execQuery("BEGIN"); //begin the transaction
termId = execQuery("SELECT `term_id`...")->firstRecord;
if not termId then
execQuery("INSERT INTO terms ...");
termId = mysqlInsertId();
endif
execQuery("INSERT INTO `koolkat_temp`.`creatives` ...");
execQuery("INSERT IGNORE INTO `term_relationships` ...");
execQuery("COMMIT"); // commit the transaction to make the queries effects permanent