2012-10-15 4 views
2

내가 (안드로이드에서 사용) 버그에 대한 SQL을 해결하기 위해 노력하고있어 원인, 문은 기본적으로 다음과 같습니다시간 오류

INSERT INTO log (time, message) VALUES (datetime('now'),<a_message>); 

은 "날짜는 (지금)"것 같다 데이터베이스의 핵심이며 문제는 1 밀리 초 이내에 2 회 호출 될 수 있다는 것입니다. 이 경우 키가 고유하지 않으므로 SQL 오류가 발생합니다.

REPLACE를 (를) 사용할 수는 있지만 하나 이상의 항목을 덮어 쓰게됩니다. 또한 오류 코드를 확인하고 잠자기 한 다음 다시 시도 할 수 있습니다. 나는 누군가가이 문제에 대해 더 나은 해결책을 갖고 있는지 궁금 할 뿐이다. 나는 SQL에 익숙하지 않다.

감사합니다.

+1

왜 키에 자동 증가 필드를 사용하지 않습니까? – BeRecursive

+0

@BeRecursive 테이블을 재 설계 할 권한이 없습니다. 책임자에게만 입력 할 수 있습니다. 만약 내가 할 수만 있다면 아마도 이것이 최선의 해결책 일 것입니다. – dac2009

+0

그러면 가장 좋은 답변에서 언급 한 바와 같이 약간 혼란에 빠지게됩니다. 키에 임의의 해시를 생성 한 다음 로그 메시지 앞에 시간을 추가하면 어떨까요? 이렇게하면 로그에 대한 쿼리 속도가 크게 느려지지만 시간이 중요한 작업이 아닐 수도 있습니다. – BeRecursive

답변

4

어쨌든 당신을 깜짝 놀라게 할 다른 많은 일들의 시간대, 도약대 및 많은 것들이 있기 때문에 어쨌든 datetime을 기본 키로 사용하는 것을 주저해야합니다. a1 = datetime('now')이 항상 다음 번 호출의 다음 호출보다 작거나 같음을 보장하지 않습니다. a2 = datetime('now')

날짜, 시간 및 시간대에 대해 약 1/3 이야기를 읽으면서이 기사를 읽으십시오. 나는 신속하고 더러운 해킹 작업 주위를 원한다면, 내가 while 루프에 삽입을 둘 것입니다

https://msmvps.com/blogs/jon_skeet/archive/2009/11/02/omg-ponies-aka-humanity-epic-fail.aspx

: 이것은 당신이이 질문에 요구되는 일을하려고하지 말아야 함을 확신한다 삽입이 실패 할 때 오류를 포착 한 다음 1 밀리 초 후에 다시 시도하십시오. 이것은 나쁘고 침실에 큰 혼란을 남기는 것과 같습니다. 그러나 때로는 테이블을 재 설계하여 합리적인 기본 키를 갖기에는 너무 오래 걸릴 것이기 때문에 필요합니다.

그러나이 작업을 수행하는 경우 코드가 반복되는 동안 루프에 앉아서 수십 밀리 초 동안 참을성있게 기다리면서 코드가 준비되어 있어야하고 마지막으로 열린 슬롯을 찾으면 코드가 실행되지 않습니다. 미래에 일어난 다른 항목 (실제로는 과거에 있었던 것)이 나타나기 때문에 기대하십시오. 그것에 대해 생각하면 머리가 아플 수 있습니다.

+0

+1 "거대한 혼란 ..." – podiluska

+0

고마워, 또한 아주 좋은 기사! – dac2009

2

심플. 기본 키로 시간 값을 사용하지 마십시오. 대신 대리 키를 자동으로 증가시키는 추가 열이있는 테이블을 만드십시오.

CREATE TABLE log (
    id   INTEGER PRIMARY KEY AUTOINCREMENT, 
    time  REAL, 
    message TEXT 
) 

기존의 INSERT가 정상적으로 작동합니다.

시간 필드를 기반으로 레코드 검색을 최적화해야하는 경우에도 그렇게 할 수 있습니다. 해당 필드의 색인을 추가하기 만하면됩니다. 해당 필드에서 조인을 사용하면 특정 시간을 갖는 것이 하나의 특정 레코드와 일치하지 않는다는 것을 알고 있어야합니다.

+0

감사합니다. 훌륭한 답변이지만 테이블을 다시 디자인 할 수는 없습니다. – dac2009

+0

@ dac2009 - 그럼 당신은 "오른쪽 엉망"으로 붙어 있습니다. – MatBailie