developer tip

MySQL이 유효한 자동 증가 값으로 0을 사용하도록 강제하는 방법

optionbox 2020. 10. 24. 10:02
반응형

MySQL이 유효한 자동 증가 값으로 0을 사용하도록 강제하는 방법


간단히 말해서 skel스타일 파일 로 가져올 SQL 파일 이 있으므로이 작업은 프로그래밍 방식으로 반복적으로 수행됩니다. 원하는대로 SQL 파일을 편집 할 수 있지만 응용 프로그램 자체는 건드리지 않습니다.

이 응용 프로그램은 userid = 0익명 사용자를 나타내는 데 사용 합니다. 또한이 '사용자'를 나타내는 관련 (빈) 항목이 데이터베이스에 있습니다. 따라서 내 라인 skel.sql은 다음과 같습니다.

INSERT INTO `{{TABLE_PREFIX}}users` VALUES (0, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL);

이 문제는 즉 uidA는 auto_increment필드,있는, 기술적으로 0잘못된 값입니다. 또는 적어도 0으로 설정하면 기본적으로 MySQL에 "이 필드에 다음 ID를 삽입하십시오."라고 말하는 것입니다.

지금, 나는 내가 넣을 수도있을 것 같군요 INSERT다음 UPDATE내 SQL 파일에 쿼리를하지만, 그래, 나는 실제로 삽입 할 것을 일반적으로 MySQL의 이야기의 방법이 0이 필드에가?


내가 여기에 얻은 대답 에서 :

당신이 사용할 수있는:

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'

여기설명 된대로 MySQL은 INSERT / UPDATE ID 0을 다음 시퀀스 ID로 해석하지 못합니다. 이러한 동작은 NULL로 제한됩니다.

그래도 응용 프로그램에서 꽤 나쁜 행동이라고 생각하는 것입니다. 특히 나중에 복제를 구현하기로 선택한 경우 일관되게 사용된다는 점에주의해야합니다.


다음을 사용하여 SQL DB 모드를 확인하십시오.

SELECT @@[GLOBAL|SESSION].sql_mode;

비어 있거나 설정되지 않은 경우 다음을 사용하십시오.

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'

조심해! 을 사용 GLOBAL하는 경우 즉각적인 변경이 아니므로 설정을 적용하려면 연결을 다시 시작해야합니다.

따라서 예를 들어 한 DB에서 다른 DB로 데이터를 복원하고이 설정이 적용되었는지 확실하지 않은 경우 SESSION즉시 변경 (연결을 닫을 때 재설정 됨)을 사용하십시오. 완료되면 0 값을 입력하면 변경 되어도 변경되지 않습니다 sql_mode.

이 모드 (및 기타)를 재설정하려면

SET [GLOBAL|SESSION] sql_mode=''

0 자동 증가 값은 MySQL 데이터베이스에서 기본값으로 설정되어 있지 않으므로 권장되지 않습니다.

자세한 내용은 mysql dev 페이지 주제 를 확인하십시오.

최신 정보

MariaDB의 경우이 주석 에서 지적한 명령을 사용하십시오 .

SET sql_mode='NO_AUTO_VALUE_ON_ZERO'

mysql 변수를 다루고 싶지 않다면 유용한 해킹이 있습니다.

INSERT INTO `{{TABLE_PREFIX}}users` VALUES (-1, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL);

그리고

UPDATE `{{TABLE_PREFIX}}users` SET id = 0 where id = -1;

분명히 이것은 부호있는 정수를 사용하고 테이블 ID에 음수 값을 사용하지 않는다고 가정합니다.


안전한 방법 :

SET @@session.sql_mode = 
    CASE WHEN @@session.sql_mode NOT LIKE '%NO_AUTO_VALUE_ON_ZERO%' 
        THEN CASE WHEN LENGTH(@@session.sql_mode)>0
            THEN CONCAT_WS(',',@@session.sql_mode,'NO_AUTO_VALUE_ON_ZERO')  -- added, wasn't empty
            ELSE 'NO_AUTO_VALUE_ON_ZERO'                                    -- replaced, was empty
        END
        ELSE @@session.sql_mode                                             -- unchanged, already had NO_AUTO_VALUE_ON_ZERO set
    END
  • NO_AUTO_VALUE_ON_ZERO가 sql_mode에 이미 설정되어 있는지 확인합니다.
  • 비어 있지 않은 경우 sql_mode에 추가
  • 세션 만 설정합니다. 0을 삽입해야하는 세션에서만 사용하는 것이 좋습니다.

참고 URL : https://stackoverflow.com/questions/1142472/how-to-force-mysql-to-take-0-as-a-valid-auto-increment-value

반응형