2015-04-08 61 views
0

这是我的代码。我收到“IF NOT EXISTS ...”语句的语法错误。对于我想在这里做什么来说,这是非常明显的。如果记录存在于术语表中,我想知道唯一的term_id。如果该记录不存在,我想插入一条新记录并获得唯一的term_id,这将在随后的语句中需要。如果记录不存在,将记录插入到mysql中,并在任一场景中保存唯一的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

我认为这可能类似于你要找的东西:[链接](http ://stackoverflow.com/questions/1361340/how-to-insert-if-not-exists-in-mysql) –

+0

虽然这将工作,我仍然不知道如何提取唯一term_id万一如果记录存在。 – hvs

+0

您可以运行两个查询,这可以简化并使代码更易于维护。 – Cristik

回答

1

您可以打破你的creatives查询分为三个简单的人(搜索单词ID,插入如果长期不存在,插入creatives),并包裹他们,一个在事务内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 

如果你想保持它的服务器端,您可以创建一个包含上述查询的存储过程。您可以配置存储过程以允许参数,从而可以轻松定制您的查询。一些沿线(赦免任何语法错误,我现在没有在我面前的MySQL):

-- change the default ';' delimiter to be able to use it inside the SP 
DELIMITER $$ 
CREATE PROCEDURE add_term_and_other(term varchar(50)) 
BEGIN 
    BEGIN; 
    INSERT INTO `koolkat_temp`.`creatives` ...; 
    SET @record_pointer = LAST_INSERT_ID(); 
    SELECT `term_id` INTO @term_id_placement FROM ..; 
    IF ISNULL(@term_id_placement) THEN 
     INSERT INTO `terms` ...; 
     SET @term_id_placement = LAST_INSERT_ID(); 
    ENDIF; 
    INSERT IGNORE INTO `term_relationships` ...; 
    COMMIT; 
END$$ 
-- get back to the original delimiter 
DELIMITER ; 
+0

关心用示例代码解释多一点?谢谢。 – hvs

+0

我已经更新了我的答案,如果您需要更多详细信息,请告知我。 – Cristik

+0

谢谢,但目前我无法使用其他平台。我需要建立逻辑到mysql查询语言本身。这看起来似乎有道理,还是我问得太多了? – hvs

相关问题