INSERT / REPLACE INTO ... SELECT;重复的问题

时间:2014-06-23 13:22:26

标签: mysql sql insert-into

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

groupofficecom中一个事件的数据存储在两个表cal_eventscf_cal_events中。 cal_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数据库中更新更改的事件。

谢谢大家!

1 个答案:

答案 0 :(得分:0)

问题#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个元素,对此元素执行两个操作,每个操作都有两个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

将使用&#34返回4行;我是副本"

问题#2

REPLACE INTO不能自动增加主键MySQL REPLACE in an auto incremented rowPHP mySQL - Insert new record into table with auto-increment on primary key

您可以在替换时尝试主键列上的DEFAULT占位符:

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直接使用主键值更新行来识别它们。