2013-04-24 2 views
0

에 여러 태그를 추가, 다음 ID를 선택하고 이름은 내가 creat에나는 데이터베이스에서 테이블 <code>tags</code>이 내가 태그의 <code>name</code> 존재하지 않을 경우 추가 값을 기준으로 한 쿼리를 생성 할 테이블

태그 ID를 선택 존재하는 경우 간단한 코드 :

DELIMITER $$ 
USE `cc`$$ 
DROP FUNCTION IF EXISTS getTagId$$ 
CREATE FUNCTION getTagId (tag CHAR(20)) RETURNS INT CHARSET utf-8 
    BEGIN 
     DECLARE id INT 
     set @id = (select id from tags where name = @tag) 
      if (@id is null) then 
      insert into tags(name) values(@tag) 
      set @id = (select last_insert_id()) 
      end if 
     SELECT @id 
    END 
delimiter; 

그러나이 코드는 작동하지 않습니다 (이것은 MySQL의 첫 번째 기능 임).

나는 하나의 쿼리에서 10 개 이상의 태그를 추가하고 싶습니다. 최적화 방법에 대한 아이디어가 있습니까?

+0

하는 식으로 무시하지 tags.name에 고유 인덱스를 추가 :

는 같은 목표를 달성하기 위해 일하니? – sashkello

+0

음, 이것은 매우 간단한 조작이므로 효율적입니다. 함수는 MySQL에서는 효율적이지 못합니다 (많은 네트워크 트래픽을 절약하지 않는 한 그렇습니다). –

답변

0

하지만 아마도 내 옛 대답은 쓸모가 없습니다. 진짜 질문은 :이 Stored Function이 정말로 필요합니까? 나는 당신이 중복을 피하기 위해 이것을하려고 노력하고있는 것 같습니다.

  • (즉 태그가 이미 존재하는 경우 오류를)
  • 사용 INSERT 그것은 '아무튼
+0

페데리코, 그게 더 효율적입니까? 분당 600 개의 태그를 추가하는 데 필요합니다. –

+0

Jakub, 초당 10 개의 1 필드 INSERT가 실제로 문제가 될 수 없습니다. 또한, 다음보다 더 고려하십시오 : Stored Procs는 MySQL에서 느립니다; 명시 적 SELECT는 UNIQUE 제약 조건을 적용하는 것보다 항상 느립니다. –

0

마지막 줄 앞에 $$을 추가해야합니다.

는 또한, 당신은 수를 반환하고, 캐릭터 세트 말도 지정 ;

을 많이 잊어 버렸습니다, 아마 구문 오류입니다. NOT 다음

((이름 = 태그) 태그의 ID 선택)이있는 경우 단순히 @id과와

드롭 모든 라인은 RETURN last_insert_id();

를 추가 (또한 내가 태그에서 @를 제거하는 것으로를!)

아마도 더 많은 오류가 있지만 다음과 같은 별이 있습니다.