如果没有在mysql中显示语法错误

时间:2014-04-05 12:40:06

标签: mysql tsql

我正在尝试将此tsql转换为mysql,但显示错误需要帮助

  CREATE PROCEDURE FormAdd 

  @formName varchar(MAX)   
  AS  
  IF NOT EXISTS(SELECT * FROM tbl_Form WHERE formName=@formName)  
  BEGIN  
  INSERT INTO tbl_Form  
  (formName)  
  VALUES  
  (@formName)  
  SELECT @@identity  
  END  
  ELSE  
  BEGIN  
  SELECT  '-1'  
  END  

MySQL的

CREATE PROCEDURE FormAdd              
  (p_formName varchar(500)   )
  begin

  INSERT INTO tbl_Form (formName)  
  VALUES (p_formName)
   where NOT EXISTS(SELECT * FROM tbl_Form WHERE formName=p_formName)  ;

  SELECT Last_insert_id() as returnvalue ;

  SELECT  '-1'  ;
end

1 个答案:

答案 0 :(得分:0)

您的尝试在语法上无效,因为从逻辑上讲,INSERT语句不能包含WHERE子句,因为它不会对现有行执行操作。

如果目的是仅在p_formname的值尚未存在时插入,则适当的步骤是首先在该列上定义唯一索引。然后,构建您的过程以尝试插入并检查the ROW_COUNT() value以查看是否插入了一个并相应地执行操作,如果不调整现有的T-SQL过程,则返回-1

首先在p_formname上创建唯一索引:

ALTER TABLE tbl_Form ADD UNIQUE KEY `idx_formName` (`formName`);

然后您的程序应使用INSERT INTO...ON DUPLICATE KEY UPDATE来尝试插入行。根据文档,ROW_COUNT()的值如果未插入新行,则为0,如果是,则为1

CREATE PROCEDURE FormAdd (p_formName varchar(500))
BEGIN
  /* Attempt the insert, overwrite with the same value if necessary */
  INSERT INTO tbl_Form (formName) VALUES (p_formName) ON DUPLICATE KEY UPDATE formName = p_formName;

  /* Return the LAST_INSERT_ID() for a new row and -1 otherwise */
  SELECT 
    CASE 
      WHEN ROW_COUNT() = 1 THEN LAST_INSERT_ID() 
      ELSE -1
    END AS returnValue;
END