programing

MySQL: 자동 증가 열이 있는 테이블에 삽입 후 예기치 않은 SELECT 결과

oldcodes 2023. 10. 21. 10:50
반응형

MySQL: 자동 증가 열이 있는 테이블에 삽입 후 예기치 않은 SELECT 결과

일부 데이터를 테이블에 삽입한 다음 동일한 테이블에서 SELECT 쿼리를 실행하면 이상한 동작이 나타납니다.이 테이블에는 자동 증분 기본 키(uid)가 있으며, 이 문제는 'uid IS NULL'에서 결과를 선택하려고 할 때 발생합니다.

이 내용을 다음 SQL 명령으로 요약했습니다.

DROP TABLE IF EXISTS test_users;
CREATE TABLE test_users (uid INTEGER PRIMARY KEY AUTO_INCREMENT, name varchar(20) NOT NULL);
INSERT INTO test_users(name) values('foo');
SELECT uid FROM test_users WHERE uid IS NULL;
SELECT uid FROM test_users WHERE uid IS NULL; -- no output from this query

예상합니다.SELECT uid FROM test_users WHERE uid IS NULL어떤 것도 돌려주지 않지만, 가끔은 돌려주기도 합니다.제가 찾은 것은 다음과 같습니다.

  • MySQL/MariaDB 버전이 중요해 보입니다.이 문제가 발생한 시스템은 MySQL 5.1.73(CentOS 6.5, 32비트 및 64비트)을 실행하고 있습니다.5.5.37-MariaDB(페도라 19, 64비트)를 실행하는 내 다른 기계.MyISAM 테이블을 사용하도록 구성된 것 외에도 실행 중인 기본 구성.
  • INSERT 후 첫 번째 SELECT 쿼리만 영향을 받습니다.
  • 자동 증가가 아닌 uid 값을 지정하면 됩니다.
  • INSERT와 SELECT 사이에 연결을 끊었다가 다시 연결하면 예상되는 아무런 결과가 나타나지 않습니다.이는 Perl과 같이 연결 개체를 관리하는 곳에서 가장 쉽게 볼 수 있습니다.https://gist.github.com/avuserow/1c20cc03c007eda43c82 에서 이를 보여주는 테스트 스크립트가 있습니다.

이 동작은 의도적인 것입니다.

그것은 분명히 다음과 같습니다.SELECT * FROM t1 WHERE id = LAST_INSERT_ID();설명한 대로 삽입을 방금 한 연결에서만 작동합니다.

일부 환경에서는 일반적인 방법으로 마지막으로 삽입된(연결을 통해) 행의 자동 증가 값을 가져오는 것을 어렵게 만드는 해결책인 것 같습니다.

정확히 말하면 연결의 마지막 삽입문에 의해 삽입된 첫 번째 행에 할당된 auto_increment 값입니다.하나의 행만 삽입했을 때는 동일하지만, 하나의 삽입문으로 여러 행을 삽입했을 때는 동일하지 않습니다.

http://dev.mysql.com/doc/connector-odbc/en/connector-odbc-usagenotes-functionality-last-insert-id.html

언급URL : https://stackoverflow.com/questions/23685742/mysql-unexpected-select-result-after-insert-into-table-with-autoincrement-colum

반응형