2010-02-08 8 views
13

레코드를 확인하는 쿼리가 있고 삽입되지 않았 으면 삽입합니까? 중복 된 업데이트 또는 교체를 원하지 않습니다. 하나의 쿼리 솔루션을 찾고, 다른 답변을 보았지만 실제로 원하는 것은 아닙니다.mysql 조건부 삽입 - 존재하지 않는 경우 삽입

테이블 :

name|value|id 
------------------ 
phill|person|12345 

의사 쿼리

IF NOT EXISTS(name='phill', value='person', id=12345) INSERT INTO table_name 
+1

약간의 질문을 명확히 할 수 있습니까? 유일한 유일한 필드는 id입니까? (빠르고 독특한 방식으로 고유 한 인덱스를 사용할 수 있으며 중복 된 값을 가진 행을 삽입하려고하면 실패합니다). 이름과 값이 고유해야합니까? –

+0

세 값은 모두 고유하며 비워서는 안됩니다. ID에는 색인이 있지만 이름과 값은 달라야하지만 ID는 필수 항목입니다 –

답변

18

사용 REPLACE이 - 테이블에 오래 된 행은 대한 새 행과 동일한 값이있는 경우를 제외 정확히 INSERT처럼 작동 PRIMARY KEY 또는 UNIQUE 인덱스의 경우 새 행이 삽입되기 전에 이전 행이 삭제됩니다. 다른 옵션이다 REPLACE 사용할 수 없기 때문에 :

http://dev.mysql.com/doc/refman/5.0/en/replace.html

-- For your example query 
REPLACE INTO table_name(name, value, id) VALUES 
('phill', 'person', 12345) 

편집 (기본 키, 고유성) 테이블 데이터에 대한 설정 제약 인덱스와 사용하는 INSERT IGNORE

INSERT IGNORE INTO table_name 
SET name = 'phill', 
    value = 'person', 
    id = 12345; 
+0

예 기능을 이해하지만 사용자는 SELECT, INSERT, UPDATE에만 액세스 할 수 있습니다. 하지만 난 멀리에서 체재하려고 노력하고있어 내가 REPLACE 함수에 대한 허가가 있는지 모르겠다. –

+2

IGNORE 삽입하기 – Yada

+0

INSERT IGNORE를 삭제하고 레코드를 다시 추가합니까? 또는 발견되면 그것을 건너 뛰고 발견되지 않으면 삽입합니까? –

2

행이 이미 존재하지 않는 경우에만 행을 반환하는 하위 쿼리가있는 선택 쿼리에서 삽입을 수행하는 방법은 무엇입니까?

는 의사 코드 :이 패턴은 작동합니다

INSERT INTO TABLE_FOO (...) 
SELECT @VAR1, VAR2 ... 
FROM DUMMYTABLE -- THIS TABLE SHOULD CONTAIN 1 RECORD OF ANYTHING 
       -- IN CASE THE FROM IS REQUIRED 
WHERE (SELECT COUNT(*) FROM TABLE_FOO WHERE COLUMN1 = @VAR1) = 0 

, 당신은 MySQL을위한 올바른 구문을 얻을해야합니다.

+2

키 또는 고유 항목을 사용하지 않는 행을 처리 할 때 유용합니다. – zigg