Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 不使用唯一或主键进行更新或插入_Mysql_Sql - Fatal编程技术网

Mysql 不使用唯一或主键进行更新或插入

Mysql 不使用唯一或主键进行更新或插入,mysql,sql,Mysql,Sql,我正在尝试更新表,但出现以下异常: 1064-您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 在“如果存在”附近,从indv\u val= 第1行的ind_id=' 我使用的查询是 IF exists (SELECT * FROM `indicadores_val` WHERE `indv_val` = '' AND `ind_id` = 11) THEN UPDATE indicadores_val

我正在尝试更新表,但出现以下异常:

1064-您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 在“如果存在”附近,从indv\u val= 第1行的ind_id='

我使用的查询是

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 ;

您需要在查询结束时使用END IF
请参阅IF语法的文档。最可能的原因是此代码不在存储过程或函数中。阅读if语句

我猜你想要这样的东西:

INSERT INTO `indicadores_val`(ind_id, ind_valr11, ind_valr12)
    values ( 11, 60, 60 )
    on duplicate key update ind_valr11 = 34, ind_valr12 = 54;
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 ;
我不确定invv_val上的条件是如何应用的。是否确实希望该字段中存在值以阻止更新?

请重试

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)

如果不使用唯一约束,则需要在脚本中实现条件逻辑。您可以选择脚本语言,也可以使用MySQL存储过程

存储过程如下所示:

INSERT INTO `indicadores_val`(ind_id, ind_valr11, ind_valr12)
    values ( 11, 60, 60 )
    on duplicate key update ind_valr11 = 34, ind_valr12 = 54;
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 ;

更新时没有WHERE子句?可能会出现什么问题?如果你不能拥有唯一/主键,那么去抓一个线索棒,并在idjit中加入一些智能,idjit将该要求放到了代码库中。步骤1-运行子查询。我不能拥有唯一或主键-是的,你可以。别傻了,像IF/ELSE这样的控制结构只在MySQL存储过程、函数和触发器中有效。您不能在任意查询中使用它们,这就是语法错误的根源。如果存储过程不能解决您的问题,您可能没有在各种情况下使用足够的存储过程,不是吗?这是一个聪明的解决方案,可以解决一个无法治愈的坏模式,但它只是将坏模式僵化,使其更难放松。@tadman我不同意。问题的实质是:如何根据特定行的存在有条件地执行更新或插入?。答案是,如果在MySQL中这样,就不能使用,它要么需要在客户端代码中,要么需要在存储的进程中。由于OP没有说明使用了什么客户机语言,所以我认为以存储过程的形式给出示例更容易。在没有其他知识的情况下,您的解决方案可以说是最好的,但正如您所建议的,应用程序代码是这里更好的解决方案。我使用php,我通过函数upsert$find、$insert、$update来解决我的问题{$consoroff=new conexion;$consoroff->conectarBD;$consoroff->consortarbd$find;if$regis=$consoroff->obtenerResultado{$consoroff->consortarbd$update;}否则{$consoroff->consortarbd$insert;}