gpt4 book ai didi

mysql - 插入/替换到...选择;重复问题

转载 作者:行者123 更新时间:2023-11-30 00:07:48 24 4
gpt4 key购买 nike

我的数据库 bd_yellowbox 中的事件应添加到数据库 groupofficecom 中。 bd_yellowbox中的一个事件的数据存储在elementactionsactionsparam三个属性表中。所有三个表都有一列,ID_ELEMENT。对于一个数据点,该列在所有三个表中具有相同的值。

groupofficecom 中的一个事件的数据存储在两个表中:cal_eventscf_cal_eventscal_events 的主键是 id 并且自动递增。 cf_cal_events 的主键是 model_id 并且自动递增。

cf_cal_events.model_id = cal_events.id

这两个数据库通过表 cf_cal_events 中的列链接:

cf_cal_events.col_10 = bd_yellowbox.element.ID_ELEMENT

这是我的原始代码:

REPLACE INTO groupofficecom.cal_events (data1,data2)
VALUES ('1','Tom Hanks')

REPLACE INTO groupofficecom.cf_cal_events (model_id, col_10)
SELECT groupofficecom.cal_events.id, bd_yellowbox.element.ID_ELEMENT
FROM bd_yellowbox.element, groupofficecom.cal_events
WHERE bd_yellowbox.element.ID_ELEMENT=bd_yellowbox.actions.ID_ELEMENT
AND bd_yellowbox.element.ID_ELEMENT=bd_yellowbox.actionsparam.ID_ELEMENT;

问题 #1:在 cf_cal_events 中插入数据导致一个事件被插入为具有不同 ID 的多个事件。

问题#2:当我重新执行查询时,事件将作为新事件重新插入到两个表中。由于 cf_events.id 的 AUTO_INCREMENT,这会创建新的 id,从而阻止在 bd_yellowbox 数据库中更新已更改的事件。

谢谢大家!

最佳答案

问题 #0:您仍未提供 https://stackoverflow.com/help/mcve 。您确定当前的代码片段会执行吗?

问题#1

我认为这个问题与你的数据库结构有关。正如我所想:

一个 yellow_box.element 可以有多个 yellow_box.action - 一个元素可以被多次执行是合乎逻辑的。

一个 yellow_box.action 可以有多个 yellow_box.action_param - 它不太明显,也可能不是这样

这意味着如果我们有:

CREATE TABLE yellow_box.element
(
ElementId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Description nvachar(128)
)

CREATE TABLE yellow_box.actions
(
ActionId INT NOT NULL AUTO_INCREMENT PRIMARY KEY
ElementId INT NOT NULL REFERENCES yellow_box.element(ElementId),
Description nvachar(128)
)

CREATE TABLE yellow_box.actions_param
(
ActionParamId INT NOT NULL AUTO_INCREMENT PRIMARY KEY
ActionId INT NOT NULL REFERENCES yellow_box.actions(ActionId),
Description nvachar(128)
)

有1个元素,这个元素上有两个 Action ,每个 Action 有两个actions_param,会返回多少行

SELECT element.ElementId, action.ActionId, param.ActionParamId 
FROM yellow_box.element AS element
INNER JOIN yellow_box.actions AS action
ON action.ElementId = element.ElementId
INNER JOIN yellow_box.actions_param AS param
ON param.ActionId = action.ActionId

将是 4 行。

这就是所有这些重复行的来源 - 您加入的(仅使用 WHERE 子句)这些表增加了结果集,但从未使用过它们形成的任何列 - 这就是您看到完全重复的原因:

SELECT "I am the duplicate" 
FROM yellow_box.element AS element
INNER JOIN yellow_box.actions AS action
ON action.ElementId = element.ElementId
INNER JOIN yellow_box.actions_param AS param
ON param.ActionId = action.ActionId

将返回 4 行,其中包含“我是重复项”

问题#2

REPLACE INTO 不适用于自动递增主键 MySQL REPLACE in an auto incremented row , PHP mySQL - Insert new record into table with auto-increment on primary key

您可以在替换时尝试在主键列上使用默认占位符:

REPLACE INTO yellow_box.actions_param(ActionId, Description)
VALUES (100, "Original")

REPLACE INTO yellow_box.actions_param yellow_box.actions_param(ActionParamId, ActionId, Description)
VALUES (DEFAULT, 100, "Original")

但我不确定它是否有效

或者您可以尝试使用更新语句 http://www.tutorialspoint.com/mysql/mysql-update-query.htm使用主键值直接更新行来识别它们。

关于mysql - 插入/替换到...选择;重复问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24367089/

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