我的数据库bd_yellowbox
中的事件应添加到数据库groupofficecom
中。 bd_yellowbox
中一个事件的数据存储在三个属性表element
,actions
和actionsparam
中。所有三个表都有一个共同的列,ID_ELEMENT
。对于一个数据点,该列在所有三个表中具有相同的值。
groupofficecom
中一个事件的数据存储在两个表cal_events
和cf_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
数据库中更新更改的事件。
谢谢大家!
答案 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 row,PHP 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直接使用主键值更新行来识别它们。