programing

MySQL 열 유형 "TIMESTamp"에는 "NOT NULL DEFAULT CURRENT_TIMESTamp ON UPDATE CURRENT_TIMESTamp"가 함축적으로 포함되어 있습니다.

css3 2023. 9. 27. 18:07

MySQL 열 유형 "TIMESTamp"에는 "NOT NULL DEFAULT CURRENT_TIMESTamp ON UPDATE CURRENT_TIMESTamp"가 함축적으로 포함되어 있습니다.

몇 시간 동안 이 버그를 추적했습니다.다음 SQL이 주어졌을 때:

DROP DATABASE IF EXISTS db;
CREATE DATABASE db;
CREATE TABLE db.tbl (t1 TIMESTAMP) ENGINE=INNODB;
SHOW CREATE TABLE db.tbl;

마지막 줄은 다음과 같습니다.

'CREATE TABLE `tbl` (
  `t1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1'

도대체 어디서 하는 거지?NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP어디서 왔습니까?저는 그 중 어떤 것도 쓰지 않았고, 그 중 어떤 것도 원하지 않습니다. 그리고 MySQL이 그런 추정을 할 것이라는 말에 좀 막막합니다.

이상하고 모호한 구성 옵션을 켜거나 끄나요?기본 동작입니까?벌레라고요?어쨌든 MySQL이 정상적으로 동작하도록 하려면 어떻게 해야 합니까?

MySQL 5.6.5에는 이 초기화와 관련된 몇 가지 업데이트가 있으며, 이 링크(Automatic Timestamp Properties Before MySQL 5.6.5)에서 확인할 수 있습니다.

MySQL <= 5.6.5를 사용하는 경우 이 초기화를 무시하려면 DEFAULT 값을 0 또는 NULL이 허용된 NULL로 설정해야 합니다.

CREATE TABLE tbl
(
    field1 TIMESTAMP DEFAULT 0,
    field2 TIMESTAMP NULL DEFAULT NULL
)

MySQL >= 5.6.6을 사용하는 경우 explicit_defaults_for_timestamp라는 매개 변수가 기본적으로 비활성화되어 있습니다.이 설정을 활성화하거나 DEFAULT 값을 이전 MySQL 버전과 동일한 접근 방식인 0 또는 NULL로 설정할 수 있습니다.

MySQL >= 8.0.2를 사용하는 경우 explicit_defaults_for_timestamp가 기본적으로 활성화됩니다.이렇게 하면 비표준 동작이 비활성화됩니다(감사하게도).또한 MySQL은 이 설정을 비활성화하면 경고를 생성합니다.예를 들어, A에 대한 DEFAULT 값을 정의하지 않으면TIMESTAMP열, 자동으로 다음으로 설정됩니다.NULL.

CREATE 문에 명시적으로 명시하지 않더라도 사용되고 있는 기본값입니다.둘 다 피하고 싶다면 다음을 사용합니다.t1 TIMESTAMP DEFAULT 0아니면ts1 TIMESTAMP NULL DEFAULT NULL

갱신하다

MySQL 5.6.5 이전에는 사용만 가능했습니다.TIMESTAMP행이 변경되면 자동으로 업데이트되는 열을 가지려는 경우.유감스럽게도 이 기능은 MyISAM에 한정되어 InnoDB 테이블에서는 사용할 수 없습니다.

MySQL 5.6.5를 통해 다음과 같은 기능을 제공합니다.DATETIME뿐만 아니라.자세한 내용은 이 사이트의 다른 게시물 참조

언급URL : https://stackoverflow.com/questions/22860351/mysql-column-type-timestamp-implicitly-includes-not-null-default-current-time