2014-06-23 2 views
0

내 데이터베이스의 이벤트 bd_yellowbox은 데이터베이스 groupofficecom에 추가해야합니다. bd_yellowbox에있는 하나의 이벤트 데이터는 세 개의 속성 표 element, actionsactionsparam에 저장됩니다. 세 테이블 모두 공통적으로 하나의 열이 있습니다 (ID_ELEMENT). 한 데이터 요소에 대해 세 테이블 모두에서 열의 값이 같습니다.INSERT/REPLACE INTO ... SELECT; 중복 문제

groupofficecom의 한 이벤트 데이터는 cal_eventscf_cal_events의 두 테이블에 저장됩니다. cal_events의 기본 키는 id이며 자동 증가됩니다. cf_cal_events의 기본 키는 model_id이고 NOT 자동 증가입니다.

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 데이터의 삽입이

여기 내 원래 코드의
cf_cal_events.col_10 = bd_yellowbox.element.ID_ELEMENT 

:

cf_cal_events.model_id = cal_events.id 

두 데이터베이스

테이블 cf_cal_events의 열 통해 연결된 하나의 이벤트가 다른 ID로 여러 이벤트로 삽입됩니다.

문제 2 : 쿼리를 다시 실행하면 두 이벤트에 새 이벤트로 이벤트가 다시 삽입됩니다. cf_events.id의 AUTO_INCREMENT 때문에 id이 새로 생성되어 변경된 이벤트가 bd_yellowbox 데이터베이스에서 업데이트되지 않도록합니다.

감사합니다.

답변

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 행이됩니다.

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 
:

모든 중복 행이 올 곳에서의

- 그건 당신이 완전한 중복을 본 적이 이유 - 당신의 결과 집합을 증가하는 테이블 (단지 WHERE 절을 사용하여) 합류, 그러나 결코 어떤 열을 형성 사용

문제 # "나는 중복입니다"로 4 개 행을 반환합니다 2

INTO 자동 증가 기본 키,946,323 잘 가지 않습니다 REPLACE 210, 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") 

을하지만 그것이

를 작동하거나 직접 업데이트 할 UPDATE 문 http://www.tutorialspoint.com/mysql/mysql-update-query.htm를 사용하려고 할 수 있다는 것을 확실하지 않다 기본 키 값을 사용하여 행을 식별합니다.

+0

실제로 데이터베이스가 좋지 않다는 것에 동의하지만, 두 데이터베이스가 모두 프로그램이기 때문에 아무것도 변경할 수 없으며 하나에서 다른 이벤트 만 추가하면됩니다. 그것은 한 방향 INSERT 관계입니다. – rand

+0

하지만 문제 # 0을 바로 잡을 수 있습니까? 그렇지 않으면 나는 너를 도울 방법을 모른다. –

+0

더 일반화되면서 문제를 다시 작성한다는 뜻입니까? – rand