更新或插入没有唯一或主键

时间:2014-02-03 18:18:36

标签: mysql sql

我正在尝试更新表格,但是我得到了这个例外:

  

#1064 - 您的SQL语法出错;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   接近' IF存在(SELECT * FROM indicadores_val WHERE indv_val =''   和ind_id ='在第1行

我正在使用的查询是

IF exists 
    (SELECT * 
       FROM `indicadores_val` 
      WHERE `indv_val` = '' AND `ind_id` = 11) 
THEN
    UPDATE indicadores_val 
       SET ind_valr11 = '34',ind_valr12 = '54' 
     WHERE `indv_val` = ''   AND `ind_id` =11 
ELSE
    INSERT INTO `indicadores_val` (ind_id,ind_valr11,ind_valr12)   
    VALUES (11,60,60)

这是我的架构

CREATE TABLE IF NOT EXISTS `indicadores_val` (
  `indv_id` int(11) NOT NULL AUTO_INCREMENT,
  `ind_id` int(11) NOT NULL,
  `indv_val` text NOT NULL,
  `ind_fun` int(11) NOT NULL,
  `ind_valr11` text NOT NULL,
  `ind_valr12` text NOT NULL,
  `ind_valr21` text NOT NULL,
  `ind_valr22` text NOT NULL,
  PRIMARY KEY (`indv_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=41 ;

4 个答案:

答案 0 :(得分:1)

您需要在查询结尾处使用END IF 请参阅IF语法http://dev.mysql.com/doc/refman/5.0/en/if.html

的文档

答案 1 :(得分:1)

最可能的原因是此代码不在存储过程或函数中。阅读if声明here

我怀疑你想要这样的东西:

INSERT INTO `indicadores_val`(ind_id, ind_valr11, ind_valr12)
    values ( 11, 60, 60 )
    on duplicate key update ind_valr11 = 34, ind_valr12 = 54;

我不确定如何应用invv_val上的条件。您是否真的希望该字段中存在值以防止更新?

答案 2 :(得分:1)

如果您没有使用唯一约束,那么您需要在脚本中实现条件逻辑。您可以使用您选择的脚本语言执行此操作,也可以使用MySQL存储过程。

存储过程看起来像这样:

delimiter $$

drop procedure if exists sp_inicadores_val_upsert $$

create procedure sp_inicadores_val_upsert (p_ind_id int,p_ind_valr11 int,p_ind_valr12 int) 
begin
  declare v_row_exists tinyint default 0;

  select count(*)
  into v_row_exists
  from 
  (
    select null 
    from `indicadores_val` 
    where `indv_val` = '' 
      and `ind_id` = p_ind_id 
    limit 1
  ) sub_query;

  if v_row_exists 
  then 
  THEN
    UPDATE indicadores_val 
    SET ind_valr11 = p_ind_valr11,
      ind_valr12 = p_ind_valr12 
    WHERE `indv_val` = ''   
      AND `ind_id` = p_ind_id;
  else 
    INSERT INTO `indicadores_val` (ind_id,ind_valr11,ind_valr12)   
    VALUES (p_ind_id,p_ind_valr11,p_ind_valr12);
  end if;

end $$

delimiter ;

答案 3 :(得分:0)

请尝试

INSERT INTO `indicadores_val` (ind_id,ind_valr11,ind_valr12)   
    VALUES (11,60,60)
ON DUPLICATE KEY UPDATE ind_id = VALUES(ind_id), ind_valr11 = VALUES(ind_valr11), ind_valr12 = VALUES(ind_valr11)