Mysql 不使用唯一或主键进行更新或插入
我正在尝试更新表,但出现以下异常: 1064-您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 在“如果存在”附近,从indv\u val= 第1行的ind_id=' 我使用的查询是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
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;}