2013-03-20 2 views
0

내 테이블과 같이 테이블에 존재 데이터 :mysql을 삽입하지 않을 경우 가입

text: 'lorem ipsum' 
tag1: 'music' 
tag2: 'pop' 
tag3: 'singer' 

그래서 저는 AQ가 필요합니다. tag1/tag2/tag3이 이미 "tags"에 있는지 검사하고, 그렇지 않으면 삽입 한 다음 외래 키 + "text"를 "posts"의 새 행에 삽입합니다.

나는 mysql을 살펴 본다. 존재하지 않는다면 나는 갇혀 있지만 어디서부터 시작해야할지 모른다. 여러 쿼리를 처리 할 수 ​​있지만 동일한 결과를 얻는 또 다른 방법이 있어야합니다.

누구에게도 경험이 있습니까?

내 친구는이 같은 제안

업데이트 : getTagId의 구현은 아직 행방 불명입니다 물론

CREATE FUNCTION getTagID(tag VARCHAR('100')) RETURNS int 

INSERT INTO posts (text,tag1,tag2,tag3) 
VALUES ('lorem ipsum', getTagID('music'), getTagID('pop'), getTagID('singer')); 

,하지만 그 메이크업의 의미는 무엇입니까? getTagID는 주어진 태그가있는 id를 선택해야하며, 존재하지 않으면 삽입하고 리턴한다. 어떤 도움을 주셔서 감사합니다.

솔루션

나는 MySQL의에서 사용자 정의 함수를 만들어 :

DELIMITER ;; 

CREATE FUNCTION getTagID(tag VARCHAR(100)) RETURNS BIGINT 
BEGIN 
    DECLARE tagID BIGINT; 
    SET tagID = (SELECT id FROM tags WHERE text = tag); 
    IF tagID IS NULL 
    THEN 
    INSERT INTO tags (text) VALUES (tag); 
    SET tagID = (SELECT LAST_INSERT_ID()); 
    END IF; 
    RETURN tagID; 
END;; 

DELIMITER ; 

을 지금은 그냥 같은 게시물에 삽입 할 수 삽입하는 기능을 가진

INSERT INTO posts (text,tag1,tag2,tag3) 
VALUES ('lorem ipsum', getTagID('music'), getTagID('pop'), getTagID('singer')); 

태그가 아직없는 경우에만 "태그"에 추가하고 기존 또는 새로 생성 된 태그의 ID를 제공합니다. Yipeee :)

답변

0

게시물에 삽입 한 다음 태그에 삽입해야합니다. SQL에는 다중 테이블 삽입 솔루션이 없습니다.

태그 삽입은 태그에 속한 열만 수행 할 수 있기 때문에 태그에있는 트리거의 게시물에 게시 텍스트를 삽입 할 수도 없습니다.

태그 테이블에서 중복을 피하려면 INSERT IGNORE 또는 REPLACE 또는 INSERT ... ON DUPLICATE KEY UPDATE를 사용할 수 있습니다. 자세한 내용은 "INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE"에 대한 내 대답을 참조하십시오.


귀하의 의견을 다시 보내주십시오.

자동 증가 메커니즘에서 새 ID를 생성하도록 한 경우에만 생성 된 PK를 얻을 수 있습니다. 자동 증가가 발생하면 중복 된 PK가 발생하지 않을 것입니다.

id를 지정하고 자동 증가를 바이 패스하면 어쨌든 id를 얻을 수 없습니다.INSERT에서 값을 지정한 경우 값을 쿼리 할 필요가 없습니다. 이미 값을 가져야합니다.

유일한 다른 경우는 자동 증가가 아닌 보조 고유 키가있는 경우입니다. 마지막으로 삽입 된 ID가 을 성공하고 ID를 생성하는 마지막 INSERT에서 오기 때문에

CREATE TABLE foo (id int auto_increment primary key, name varchar(10), unique key (name)); 
INSERT INTO foo (name) VALUES ('bill'); 
SELECT LAST_INSERT_ID(); -- returns 1 
INSERT INTO foo (name) VALUES ('bill'); 
SELECT LAST_INSERT_ID(); -- returns 1 

이 약간 혼란 스럽다. INSERT INTO posts (text,tag1,tag2,tag3)하여 업데이트를 다시


. 그건 repeating groups입니다. 네 개의 태그가 필요한 경우 어떻게해야합니까? 게시물에 두 개의 태그 만 있으면 어떻게됩니까? 특정 태그가있는 게시물을 어떻게 색인 생성합니까?

+0

감사합니다. INSERT IGNORE를 사용하면 삽입 후 PK를 얻을 수 있습니까? 1 거래 내에서 다음 진술에이를 사용할 수 있습니까? –

+0

응용 프로그램 서버 쪽에서 PDO/PHP를 사용합니다 –

+0

위의 또 다른 아이디어를 추가했습니다 ... 아무도 신경 쓰지 않는 것 같습니다;) –

관련 문제