2012-10-13 1 views
3

PHP를 사용하고 MySQL 데이터베이스에 새 레코드를 삽입해야합니다. 나는 그들이 REPLACE 또는 INSERT...ON DUPLICATE KEY UPDATE을 사용하도록 제안하는 몇 가지 대답을 읽었지만 잘 이해한다면이 두 옵션은 고유 한 필드 나 기본 키 (고유 한)의 사용을 암시합니다.MySQL에서 기존 레코드 교체 또는 기본 키 또는 고유 필드없이 새 레코드 만들기

따라서
Timestamp   | Query1 | Query2 | Result 
-------------------------------------------------------- 
2012-10-13 08:15:27 | American | Men  | here result 

2012-10-13 08:15:23 | American | Men  | result2 

2012-10-13 08:15:27 | American | Women | other result 

2012-10-13 08:15:27 | German | Men  | here result 

나도 같은 값을 가질 수 있습니다 기본 키 또는 "쿼리 1", "쿼리 1"과 "결과"이후 univoque 필드를 가질 수 없습니다 (예를 내가 가질 수 내 경우에는 MySQL의 테이블과 유사한 값이 "미국"(쿼리 1)와 "남자"(쿼리 1)와 다른 결과를 포함하는 더 많은 필드와 여러 기록 PHP의 순간

내가 사용하고 있습니다.

INSERT INTO results (Timestamp, Query1, Query2, Result) VALUES ('$current_timestamp', '$nationality', '$gender', '') 

어떤 단지 모든 레코드를 추가 거대한 DB를 만들 수 있습니다. 그러나 내가 원하는 것은 ent 조합 조합 검색어 1 & 검색어 2 & 결과가 없습니다. 그렇지 않으면 난 단지 "타임 스탬프"필드를 업데이 트하고 싶습니다.

Timestamp   | Query1 | Query2 | Result 
2012-10-13 08:15:23 | American | Men  | result2 

데이터베이스가 이미 "미국"& "남자"& "result2"그럼 그냥 분야 "타임 스탬프는"이 정확한 조합을 포함 예를 들어

내 PHP 스크립트는 다음 데이터를 생성하는 경우 업데이트되었습니다. 조합 (예를 들어, "미국", "남자" "result3) 다른 경우 그렇지 않으면, 새 레코드가 테이블에 추가됩니다.

당신의 도움에 미리 감사

답변

3

유사한조차없는 하나의 PRIMARY KEY 열 그 세 열이 독특한 조합으로 의미하는 경우 일반적인 AUTO_INCREMENT 정수, 당신은 복합 키로 정의해야한다.이 내용은 고유성 보존뿐만 아니라 단위로 그들에 색인을 적용하지 않습니다.

CREATE TABLE results (
    `Timestamp` DATETIME NOT NULL, 
    `Query1` VARCHAR() NOT NULL, 
    `Query2` VARCHAR() NOT NULL, 
    `Result` VARCHAR() NOT NULL, 
    /* Composite key across three columns */ 
    PRIMARY KEY (`Query1`,`Query2`,`Result`) 
); 

당신은 할 수있다 삽입 할 때 ON DUPLICATE KEY UPDATE을 사용하면 키 위반 및 U에서 삽입을 중단 할 수 있습니다. 대신 시간 소인을 pdate하십시오.

INSERT INTO results (
    Timestamp, 
    Query1, 
    Query2, 
    Result 
) VALUES (
    '$current_timestamp', /* see note below about NOW() */ 
    '$nationality', 
    '$gender', 
    '' 
) ON DUPLICATE KEY UPDATE `Timestamp` = '$current_timestamp'; 

참고 : PHP 변수가 이미 올바르게 이스케이프 된 것으로 가정합니다.

주 2 : $current_timestamp의 값이 실제로 저장된 시간 값이고 일부 저장된 값이 아닌 경우 PHP 변수를 전달하는 대신 MySQL의 NOW() 함수를 사용하는 것이 좋습니다. 같은

ON DUPLICATE KEY UPDATE `Timestamp` = NOW() 

VALUES() 목록에서 $current_timestamp 간다 ...

+0

타임 스탬프가 – davidkonrad

0

당신은 이와 같은 조건 삽입을 사용할 수 있습니다

INSERT INTO results (Timestamp, Query1, Query2, Result) 
SELECT '$current_timestamp', '$nationality', '$gender', '$result' 
    FROM DUAL 
    WHERE NOT EXISTS (SELECT * FROM results 
         WHERE Query1 = '$nationality' 
          AND Query2 = '$gender' 
          AND Result = '$result') 

dual는 원래 오라클에 도입 된 특별 한 열 테이블

소스 : http://en.wikipedia.org/wiki/DUAL_table

0

당신은 'WHERE NOT 사용할 수 있습니다 EXISTS '조항은 다음과 같습니다.

INSERT INTO results (Timestamp, Query1, Query2, Result) 
SELECT '$current_timestamp', '$nationality', '$gender', '$result' 
FROM Dual 
WHERE NOT EXISTS (SELECT * 
    FROM results 
    WHERE Query1 = '$nationality' 
    AND Query2 = '$gender' 
    AND Result = '$result' 
) 

여기서 Dual은 mysql에서 구문 적으로 올바른 쿼리를 만들기 위해 사용할 수있는 스텁/위조 테이블입니다.

+0

-1로 업데이트되어야한다는 것을 알지 못했지만 두 번째 줄에는 구문 오류가 있으며 어떻게 답변이 내 것과 다른가요? – haynar

+0

나는 그저 도움을 구하려고 노력한 것이 었습니다. 그렇습니다. 가장 명백한 해결책이기 때문에 같은 해결책을 찾았습니다. 자, 오늘 하루가 나를 downvote, 좋은 당신을 위해, 나는 괜찮아요. – mbarthelemy

+0

+1. –

관련 문제