postgres 데이터베이스에 새 부품을 삽입하는 PHP 스크립트가 있습니다. 부품이 생성되기 전에 존재하는지 확인하고 싶습니다. 어떻게해야합니까? 나는 보통의 INSERT INTO 절을 사용하고있다.삽입 전에 확인 레코드가 있습니다
답변
당신 SELECT
당신이 INSERT
또는 UPDATE
해야하는 경우처럼, 알고, 첫째 :
if (
$db->fetchOne(
'SELECT COUNT(1) FROM parts WHERE article_number = ?',
$p->article_number
)
) {
$db->update(
'parts',
$p->to_array(),
$db->quoteInto('article_number = ?', $p->article_number)
);
}
else {
$db->insert('parts', $p->to_array());
}
다시 Milen의 코멘트 : 좋은 점을! 기본 PostgreSQL 트랜잭션 격리 수준 (READ COMMITTED
)을 사용하면 다른 프로세스가 SELECT
다음에 "INSERT
"앞에 "your"부분을 삽입 (및 커밋) 할 수 있습니다.
빌드하는 앱 종류에 따라 일반적으로 DB 예외를 잡아서 그것에 대해 뭔가를하십시오 (사용자에게 다시 시도하십시오). 또는 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
으로 갈 수도 있습니다. Transaction Isolation을 참조하십시오.
거의 충돌이 예상되지 않는 경우 : 낙관적 인 방법을 사용하고 새로운 것을 삽입하고 고유성 위반이 발생하면이를 처리하십시오. 이렇게하면 현재 트랜잭션이 실패 할 때 무효화되므로 많은 작업을 수행하는 경우 먼저 확인하는 것이 좋습니다. 이 경우 SELECT EXISTS(SELECT 1 ... FROM ... WHERE ...)
을 선호합니다.
어쨌든 은 고유성 위반 가능성을 처리해야합니다. 먼저 확인해도 동시 트랜잭션이 동일한 레코드를 삽입하여 먼저 커밋 할 가능성이 있습니다.
insert into parts(article_number,category)
select 'KEYB','COMPTR'
where not exists(select * from parts where article_number = 'KEYB')
중복 된 내용을 자동으로 무시하려면 훌륭한 해결책입니다. 경쟁 조건을 겪지 않는다. 나는 그것을 직접 사용한다. – filiprem
- 1. 레코드가 하나만 삽입되고 있습니다.
- 2. 확실히 데이터베이스 레코드가 연속적인지 확인
- 3. 저장하기 전에 레코드가 있는지 확인하십시오.
- 4. mysql 데이터베이스에 삽입 된 레코드가
- 5. 삽입하기 전에 기존 레코드 확인
- 6. SQLite 레코드가 특정 시간보다 오래되었는지 확인
- 7. Codeigniter/mySQL 질문. 실제 삽입 전에 여러 삽입이 가능한지 확인
- 8. 처리 전에 확인 작업!
- 9. 캔버스 제출 전에 확인
- 10. 닫기 전에 확인
- 11. 간단한 LINQ 삽입 레코드가 작동하지 않습니다.
- 12. 직렬화하기 전에 삽입 wcf
- 13. 데이터베이스에 삽입 중이지만 레코드가 없다는 메시지가 나타납니다.
- 14. T-SQL 확인 레코드가 누락 된 이유
- 15. LINQ to SQL의 결과 집합을 반환하기 전에 레코드가 있는지 확인하십시오.
- 16. jqgrid 확인 추가 버튼을 클릭하기 전에
- 17. 여러 테이블에 jQuery 디스플레이 5 레코드가 있습니다.
- 18. 멀티 프로세싱 환경에서 오래된 레코드가 있습니다.
- 19. Sharepoint 워크 플로에 여러 레코드가 있습니다.
- 20. 저장 프로 시저 삽입 여부를 확인
- 21. 할당 전에 동등성을 확인 하시겠습니까?
- 22. 모든 페이지로드 전에 세션 확인?
- 23. 명세서에 삽입 오류가 있습니다.
- 24. 위조 확인 문제가 있습니다.
- 25. 마크 레코드가 삽입되었습니다.
- 26. sqlite3 데이터베이스에 레코드가 삽입되었습니다?
- 27. 레코드가 생성되기 전에 사용자 지정 유효성 검사 실행 중입니까?
- 28. 새 레코드가 테이블에 삽입 될 때 응용 프로그램에 메시지 표시
- 29. DB에 레코드가 있는지 확인 : 한 단계 또는 두 단계?
- 30. MySQL timestamp 레코드가 업데이트되었지만 영향을받은 행이 남아 있습니다.
Ok, SELECT else 절을 사용하십시오. 나는 이것에 초보자이다, 당신은 저에게 부호를 보여 주어서 도울 수 있는가? 나는 SELECT를 할 수 있지만 else 비트는 할 수 없다. 당신의 위대한 마음에 감사드립니다. –
코드 Russel을 추가했습니다. $ db는 Zend_Db_Adapter입니다. http://framework.zend.com/manual/en/zend.db.html#zend.db.adapter –
동일한 article_number가 포함 된 레코드가 존재 여부 확인 직후에 삽입되면 어떻게됩니까? 삽입 (일명 경쟁 조건)? –