Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.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_Insert Into - Fatal编程技术网

Mysql 插入/替换到…选择;重复问题

Mysql 插入/替换到…选择;重复问题,mysql,sql,insert-into,Mysql,Sql,Insert Into,my database bd_yellowbox中的事件应添加到数据库组Officecom。bd_yellowbox中一个事件的数据存储在三个属性表element、actions和actionsparam中。这三个表共有一列,ID_元素。对于一个数据点,该列在所有三个表中具有相同的值 groupofficecom中一个事件的数据存储在两个表中,即cal_事件和cf_cal_事件。cal_事件的主键是id,并且是自动递增的。cf_cal_事件的主键是model_id,并且不是自动递增的 cf_ca

my database bd_yellowbox中的事件应添加到数据库组Officecom。bd_yellowbox中一个事件的数据存储在三个属性表element、actions和actionsparam中。这三个表共有一列,ID_元素。对于一个数据点,该列在所有三个表中具有相同的值

groupofficecom中一个事件的数据存储在两个表中,即cal_事件和cf_cal_事件。cal_事件的主键是id,并且是自动递增的。cf_cal_事件的主键是model_id,并且不是自动递增的

cf_cal_events.model_id = cal_events.id
这两个数据库通过cf_cal_events表中的一列链接:

这是我的原始代码:

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_事件中插入数据会导致一个事件作为具有不同ID的多个事件插入

问题2:当我重新执行查询时,事件会作为新事件重新插入到两个表中。这会创建新的id,因为cf_events.id的自动增量会阻止更改的事件在bd_yellowbox数据库中更新

谢谢大家!

问题0:您仍然没有提供。你确定你当前的代码片段会被执行吗

问题1

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

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

一个yellow_box.action可以有多个yellow_box.action_参数-不太明显,可能不是这样

这意味着如果我们有:

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元素,此元素上有两个操作,每个操作有两个操作参数,将返回多少行

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排

这就是所有重复行的来源-您的joined仅使用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 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")
但我不确定它是否会起作用


或者您可以尝试使用update语句直接更新行,使用它们的主键值来标识它们。

事实上,我同意数据库不是很好,但我不能更改任何内容,因为两个数据库都是用于程序的,我只需要将事件从一个添加到另一个。这是单向插入关系,但也许您可以尝试更正问题0?因为否则我不知道如何帮助你。你是说用更一般化的方法重写问题?如果你找不到问题-划分,简化,从头开始。因为有些问题可能很难在完整的解决方案中找到。ELEMENT_ID是bd_yellowbox中所有三个表元素、操作和操作SPARAM的主键,正如我在问题中所说的。WHERE子句很好,它解决了重复的问题,但问题是:1。我无法插入groupofficecom.cf_cal_事件模型_id从groupofficecom.cal_事件2中选择groupofficecom.cal_事件.id。我无法将groupofficecom.cf\u cal\u events.id=groupofficecom.cf\u cal\u events.model\u id与groupofficecom.cf\u cal\u events.col\u 10=bd\u yellowbox.element.element\u id链接
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")