数据库
首页 > 数据库> > mysql-更新组合键上的表

mysql-更新组合键上的表

作者:互联网

我正在尝试更新与较小索引表中的行相交的数据表中的行.这两个表在数据表的组合PK上连接在一起,并使用相同的条件进行“说明选择”操作表明索引已被正确使用,并且获取了正确的唯一行-但更新仍然存在问题.

当临时表中只有1行时,对联接表的更新工作正常,但是当我有更多行时,得到MySql Error 1175,并且无法识别我指定的WHERE条件.

我知道我可以使用SET SQL_SAFE_UPDATES = 0关闭安全模式,但是有人可以告诉我我在这里不了解的内容吗?为什么我的WHERE条件不被接受,为什么当我进行NATURAL JOIN时甚至需要一个位置-为何这仅适用于右侧表(MyTempTable)中的一行?

编码

以下内容经过了极大简化,但结构上相同的创建表&代表我的问题的更新.

-- The Data Table.
Create Table MyDataTable
(
    KeyPartOne int not null,
    KeyPartTwo varchar(64) not null,
    KeyPartThree int not null,
    RelevantData varchar(200) null,
    Primary key (KeyPartOne, KeyPartTwo, KeyPartThree)
) Engine=InnoDB;

-- The 'Temp' table.
Create Table MyTempTable
(
    KeyPartOne int not null,
    KeyPartTwo varchar(64) not null,
    KeyPartThree int not null,
    Primary key (KeyPartOne, KeyPartTwo, KeyPartThree)
)Engine=Memory;

-- The Update Query (works fine with only 1 row in Temp table)
update MyDataTable natural join MyTempTable 
set RelevantData = 'Something Meaningful';

-- Specifying 'where' - roduces same effect as the other update query
update MyDataTable mdt join MyTempTable mtt
on mdt.KeyPartOne = mtt.KeyPartOne
and mdt.KeyPartTwo = mtt.KeyPartTwo
and mdt.KeyPartThree = mtt.KeyPartThree
set RelevantData = 'Something Meaningful'
where mdt.KeyPartOne = mtt.KeyPartOne
and mdt.KeyPartTwo = mtt.KeyPartTwo
and mdt.KeyPartThree = mtt.KeyPartThree;

附言当临时表仅包含一行时,以上两种更新语句都能按预期工作,但是当一行以上时,会给我错误.我真的很好奇为什么!

解决方法:

在第一个UPDATE查询中,您使用NATURAL JOIN,与NATURAL LEFT JOIN相同.

在第二个UPDATE查询中,您使用JOIN,这与INNER JOIN相同.

LEFT JOIN与INNER JOIN不同,NATURAL JOIN与JOIN不同.

不确定要执行的操作,但是如果要更新MyTempTable中存在相应条目的MyDataTable中的所有行,则此查询可以解决问题:

UPDATE
    myDataTable mdt
    INNER JOIN MyTempTable mtt ON
        mdt.KeyPartOne = mtt.KeyPartOne
        AND mdt.KeyPartTwo = mtt.KeyPartTwo
        AND mdt.KeyPartThree = mtt.KeyPartThree
SET
    mdt.RelevantData = 'Something Meaningful'

如果这不是您要尝试的操作,请澄清一下,我将更新我的答案.

标签:composite-key,join,mysql
来源: https://codeday.me/bug/20191201/2081894.html