gpt4 book ai didi

MYSQL更新查找匹配条件的外键并替换匹配不同条件的外键

转载 作者:行者123 更新时间:2023-11-30 00:01:58 26 4
gpt4 key购买 nike

我有以下表格

TAB_A
id | COUNTRY_ID | VAL
1 | 1 | val_x
2 | 1 | val_y
3 | 1 | val_z
4 | 2 | val_x
5 | 2 | val_y
6 | 2 | val_z

Tab_B.id_tab_A 当前存储来自 TAB_A 的 ID,其中 Ta_A.VAL = 'val_x' 且 Table_A.COUNTRY_ID = Table_B.COUNTRY_ID。例如 TAB_B(1,1,1) 代表 TABLE_B(id=1) => TABLE_A(1,1,val_x)

OLD TAB_B
id | COUNTRY_ID | id_tab_A
1 | 1 | 1
2 | 2 | 4

我想替换所有 TAB_B.id_val_A :

if TAB_B.id_val_A  is equal to the id for TAB_A.VAL = 'val_x'   
it becomes id for TAB_A.VAL = 'val_x'

当然 COUNTRY_ID 也必须相等

NEW TAB_B
id | COUNTRY_ID | id_tab_A
1 | 1 | 2
2 | 2 | 5

我无法使用 2 个查询,因为 COUNTRY_ID 未固定(在相同的其他情况下可以是任何内容,例如 3、4、5):

UPDATE TAB_B tb, TAB_A ta
SET tb.id_tab_A = (SELECT ta.id FROM ta WHERE ta.COUNTRY_ID = 1 AND tb.VAL = 'val_y')
WHERE ta.VAL = 'val_x' AND ta.COUNTRY_ID = tb.COUNTRY_ID;

UPDATE TAB_B tb, TAB_A ta
SET tb.id_tab_A = (SELECT ta.id FROM ta WHERE ta.COUNTRY_ID = 1 AND tb.VAL = 'val_y')
WHERE ta.VAL = 'val_x' AND ta.COUNTRY_ID = tb.COUNTRY_ID;

我不能使用:

UPDATE TAB_B tb, TAB_A ta
SET tb.id_tab_A = (SELECT ta.id FROM ta WHERE ta.COUNTRY_ID = tb.COUNTRY_ID AND tb.VAL = 'val_y')
WHERE ta.VAL = 'val_x' AND ta.COUNTRY_ID = tb.COUNTRY_ID;

作为内部选择SELECT ta.id FROM ta WHERE ta.COUNTRY_ID = tb.COUNTRY_ID AND tb.VAL = 'val_y' 将有多个值。

上面的正确做法是什么?

最佳答案

嗯,实际上这只是一个更新查询:

UPDATE TabA ta
INNER JOIN TabB tb ON ta.COUNTRY_ID = tb.COUNTRY_ID AND ta.VAL = 'val_y'
SET tb.id_tab_A = ta.id;

你说,这个(你写的同样太复杂了)不能使用,因为它会在你的子查询中返回多个值。 (暗示 future ,在示例数据中反射(reflect)此类情况。示例数据用于测试所有(边缘)情况)。
在这种情况下,您显然需要在 TabB 中添加更多条目,并且简单的更新将不起作用,除非您想在一列中存储多个条目。不要这样做,它违反了第一范式(如果您不知道我在说什么,请阅读标准化)。

无论如何,考虑到你的样本数据很小,最大的问题是,你为什么要烦恼呢?最合乎逻辑的做法是合并这两个表。 TabB 中存储的任何其他信息都取决于键 country_id,而该键在 TabA 中是多余的。我的建议是,重新考虑你的数据库设计。

关于MYSQL更新查找匹配条件的外键并替换匹配不同条件的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24949256/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com