2012-06-24 3 views
0

mysql 데이터베이스에 중복 행이 삽입되는 것을 방지하려고합니다. 테이블 이름은 즐겨 찾기이고 내 테이블에는 company_id 및 user_id라는 두 개의 열이 있습니다. 사용자가 동일한 회사를 '즐겨 찾기'로 두 번 추가하려고하지 못하도록하고 싶습니다.mysql db에 중복 행 방지, IGNORE가 작동하지 않음

$query = "INSERT IGNORE INTO favorites (item_id, user_id) VALUES ($item_id, $user_id)"; 
    mysql_query($query,$conn); 

그러나 작동하지 않습니다

이것은 내가 뭘하려합니다.

기본 키를 추가하기 위해 '테이블 변경'을 시도했지만, 동일한 즐겨 찾기 항목이 둘 이상의 'user_id'와 동일한 'user_id'에 의해 즐겨 찾기 될 수 있으므로 user_id와 item_id가 모두 키가되어야합니다. '여러 개의 즐겨 찾기 항목을 삽입 할 수 있으므로 데이터가'중복 '될 수 있지만 동일한'user_id '및'item_id '가 두 번 삽입되는 것을 방지하려고합니다.

감사합니다.

+2

두 개의 열의 복합 기본 키를 시도 했습니까? – Esailija

+0

아니요, 제발 elaborte 또는 예를 보여 주실 수 있습니까?:) – AnchovyLegend

+1

'ALTER TABLE 테이블에 'PRIMARY KEY'('item_id', 'user_id')를 추가했습니다. – Esailija

답변

1

은 당신과 같이 열 복합 기본 키를 사용할 수 있습니다

ALTER TABLE table ADD PRIMARY KEY ('item_id' , 'user_id') 

는이 같은 user_ids 및 item_ids이 허용되는 것을 의미 만 이들의 조합은 고유해야합니다.

+0

도움을 주셔서 감사합니다. ** 비슷한 문제가있는 사람들에게 : ** 자세한 내용은 @Esailijas 코멘트를 참조하십시오. – AnchovyLegend

1

복합 기본 키 (item_iduser_id)를 테이블에 추가해보십시오.

이 제약 조건을 위반하는 데이터가 이미 테이블에있는 경우 오류가 발생합니다.이 경우 새 테이블을 만들고 데이터를 새 테이블로 마이그레이션해야합니다.

0

INSERT IGNORE은 키에서만 작동합니다. 일반적으로 가지고있는 유일한 키는 테이블의 기본 키입니다.

먼저 일치하는 행을 검색하고 존재하는 경우 새 레코드를 삽입하지 마십시오.

ALTER TABLE favorites 
ADD UNIQUE(item_id,user_id) 

귀하의 삽입 쿼리가 다음 오류를 반환 :

$search_q = "SELECT `id` FROM `favorites` WHERE `item_id` = "; 
$search_q .= mysql_real_escape_string($item_id); 
$search_q .= " AND `user_id` = "; 
$search_q .= mysql_real_escape_string($user_id); 


$r = mysql_query($search_q); 
if (!mysql_num_rows($r)) { 
    # This combination doesn't exist 
    $insert_q = "INSERT INTO `favorites` (`item_id`,`user_id`) VALUES ("; 
    $insert_q .= mysql_real_escape_string($item_id).","; 
    $insert_q .= mysql_real_escape_string($user_id).")" 
    mysql_query($insert_q); 
} 
2

내가 아는 가장 쉬운 방법은 다음과 같은 쿼리를 수행 할 것 USER_ID - ITEM_ID 쌍에 UNIQUE 제약 조건을 추가하는 것입니다 당신의 INSERT 쿼리 thusly 히 수정해야하므로 이미 테이블에 존재했던 USER_ID - ITEM_ID 쌍을 삽입하려고 할 때마다 :

INSERT INTO favorites(item_id,user_id) 
    VALUES ($item_id,$user_id) 
ON DUPLICATE KEY UPDATE item_id=item_id 

나는 "INSERT가 무시"그것 때문에 사용하지 않는 것이 좋습니다 모든 오류를 무시합니다. 내 쿼리는 단순히 중복 키를 발견 할 때마다 item_id = item_id (변경 없음)를 설정하므로 데이터가 복제되지 않습니다.

또한 mysql_ * 함수 대신 MySQLi을 사용하는 것이 좋습니다. 게시 한 PHP는 두 개의 사용자 입력 변수를 확인하는 것을 잊어 버리면 mysql 주입에 매우 취약합니다. PHP 매뉴얼조차도 같은 이유로 그 기능을 적극적으로 권장하지 않습니다.