source

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

gigabyte 2022. 11. 18. 21:27
반응형

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

요약하자면, 저는 Import할 SQL 파일이 있습니다.skel이 작업은 프로그래밍 방식으로 반복적으로 수행됩니다.SQL 파일을 원하는 대로 편집할 수 있지만 애플리케이션 자체는 건드리지 않는 것이 좋습니다.

이 어플리케이션에서는userid = 0어나니머스 사용자를 나타냅니다.또한 이 '사용자'를 나타내는 관련(빈) 항목이 데이터베이스에 있습니다.그래서 제 대사에는skel.sql다음과 같습니다.

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

이 문제의 문제점은uid는 입니다.auto_increment엄밀히 따지면,0유효하지 않은 값입니다.또는 적어도 0으로 설정하면 기본적으로 MySQL에 "다음 ID를 이 필드에 삽입하십시오."라고 말하는 것입니다.

자, 이제, 내가 이걸 넣을 수 있을 것 같아.INSERT그 다음에UPDATE내 SQL 파일에 쿼리하지만 일반적으로 MySQL에 yes, 실제로 삽입하고 싶다고 말할 수 있는 방법이 있습니다.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'

주의하세요! 를 사용하고 있는 경우는, 설정을 적용하려면 , 접속을 재기동할 필요가 있습니다.

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

이 모드(및 기타)를 리셋하려면

SET [GLOBAL|SESSION] sql_mode=''

자동 증분 값은 MySQL 데이터베이스에서 기본값으로 설정되지 않으므로 0으로 설정하는 것이 좋습니다.

자세한 내용은 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에 음수 값을 사용하지 않고 부호 있는 정수를 사용하고 있다고 가정합니다.

Fail Safe 방법:

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
  • sql_mode에서 NO_AUTO_VALUE_ON_ZERO가 이미 설정되어 있는지 확인합니다.
  • 비어 있지 않은 경우 sql_mode에 추가합니다.
  • 세션만 설정합니다. 0을 삽입해야 하는 세션에서만 사용하는 것이 좋습니다.

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

반응형