Windows 용 sqlite3 버전 3.20.1을 실행하는 sqlite3에 매우 이상한 문제가 있습니다.SQLite 강제로 정렬 선택
두 테이블의 동일한 SELECT 쿼리가 다른 결과를 생성합니다. 그러나 열 데이터 유형 및 데이터는 둘 다 동일합니다. 다음은 CREATE 및 INSERT 문입니다.
CREATE TABLE key(key INTEGER UNIQUE NOT NULL);
CREATE TABLE map(key INTEGER UNIQUE NOT NULL, char TEXT);
WITH RECURSIVE cnt(x) AS (SELECT 1 UNION ALL SELECT x+1 FROM cnt LIMIT 9999) INSERT INTO key(key) SELECT x FROM cnt WHERE x >=1000 ORDER BY random();
WITH RECURSIVE cnt(x) AS (SELECT 1 UNION ALL SELECT x+1 FROM cnt LIMIT 9999) INSERT INTO map(key) SELECT x FROM cnt WHERE x >=1000 ORDER BY random();
이렇게하면 1000에서 9999 사이의 번호를 무작위로 두 열에 모두 삽입해야합니다. 그러나 두 번째 테이블의 SELECT 문은 항상 정렬됩니다. 결과는 다음과 같습니다
sqlite> SELECT key FROM map LIMIT 10;
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
sqlite> SELECT key FROM key LIMIT 10;
6165
1856
2457
2343
9095
8005
4958
4781
8334
1863
나는 다음을 시도해 보았습니다.
sqlite> DELETE FROM map;
sqlite> INSERT INTO map(key) SELECT key FROM key;
sqlite>
sqlite> SELECT key FROM map LIMIT 10;
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
여전히 분류되어 있습니다. REPLACE를 사용하는 것도 도움이되지 못했습니다. id 열을 먼저 추가하여 테이블 스키마를 약간 변경하려고 시도했지만 성공하지 못했습니다.
일부 실험을 마친 후 SELECT *
은 올바른 순서로 표시되지만 SELECT key
은 정렬 된 결과를 제공함을 발견했습니다.
sqlite> SELECT * FROM map LIMIT 10;
8418|
5869|
9753|
2886|
8354|
8244|
4063|
6692|
5440|
3508|
설명 할 수 있습니까? 버그 또는 기능입니까? 예상 출력을 얻으려면 어떻게해야합니까?
고마워요. 매우 도움이된다! – Dawood
'ORDER BY ROWID'를 추가하면 예상 한 결과를 얻을 수 있습니다. – Dawood