source

MariaDB/MySql: CREATE에서 CURRENT_TIMESTamp 설정 및 UPDATE에서 메모 변경

manysource 2023. 1. 17. 21:21

MariaDB/MySql: CREATE에서 CURRENT_TIMESTamp 설정 및 UPDATE에서 메모 변경

몇 년 동안 MySQL을 사용하지 않았고, 새로운 테이블을 만들었을 때 예상치 못한 작업이 수행되었습니다.MariaDB v5.5.60-Maria를 사용하고 있습니다.DB

두 개의 테이블이 모두 있는 테이블을 작성해야 합니다.created컬럼과 anupdated기둥.

필요한 건created행이 생성될 때만 CURRENT_TIMESTamp로 설정되며 명시적으로 변경하지 않는 한 변경되지 않습니다.

필요한 건updated행 작성 시 및 행 변경 시 모두 CURRENT_TIMESTamp로 설정됩니다.

다음을 수행할 경우:

CREATE TABLE user_prefs (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
  user VARCHAR(255) NOT NULL,
  provider VARCHAR(255) NOT NULL,
  pref VARCHAR(128) NOT NULL,
  jsondata LONGTEXT,
  created timestamp NOT NULL,
  modified timestamp NOT NULL,
  PRIMARY KEY (id),
  UNIQUE INDEX id_UNIQUE (id ASC));

그 다음에created열은 다음과 같이 설정됩니다.
기본 CURRENT_TIMESTamp ON 업데이트 CURRENT_TIMESTamp

및 그modified열은 다음과 같이 설정됩니다.
기본 '0000-00-00 00:00:00'

이렇게 하면:

CREATE TABLE user_prefs (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
  user VARCHAR(255) NOT NULL,
  provider VARCHAR(255) NOT NULL,
  pref VARCHAR(128) NOT NULL,
  jsondata LONGTEXT,
  created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  modified timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE INDEX id_UNIQUE (id ASC));

에러 코드 1293 이 표시됩니다.테이블 정의가 잘못되었습니다. DEFAULT 또는 ON UPDATE 절 **에 CURRENT_TIMESTamp가 포함된 TIMESTAMP 열은 하나만 있을 수 있습니다.

이 두 가지 설정을 모두 자동화할 수 있는 방법이 있을까요?created그리고.modified행 생성 및 변경 시modified행이 바뀔 때마다요?

잘 부탁드립니다.

MySQL의 이전 버전에서는 테이블이 하나의 열에만 날짜를 자동으로 초기화할 수 있습니다.그러나동작은 버전 5.6.5에서 수정되었습니다.이것은, 이 에러를 회피하는 몇개의 방법이 있는 것을 의미합니다.

1. MySQL을 최신 버전으로 업그레이드할 수 있습니다.


장점:

  • 데이터베이스 측에서 수정일 관리의 네이티브 명확한 구현
  • 과잉 트리거는 없습니다.

§ 로우백:

  • 현재 버전의 MySQL이 기존 프로젝트에서 사용되는 경우 업그레이드 시 몇 가지 문제가 발생할 수 있습니다.

2. @Simonare가 말한 대로 업데이트 및 레코드 작성을 위한 트리거를 생성할 수 있습니다.

장점:

  • 데이터베이스 측에서 수정 날짜 관리 구현

§ 로우백:

  • 많은 과잉 트리거가 있습니다.테이블마다 2개의 트리거를 만듭니다.즉, N개의 테이블에 대해 N*2 트리거를 생성합니다.

3. 컬럼의 기본값을 로 설정하고 컬럼의 기본값을 로 설정할 수 있습니다.이 경우 업데이트 날짜가 자동으로 생성됩니다.또한 당신이 글을 쓴다면null로.created컬럼 MySQL은 현재 날짜를 자동으로 생성하여 컬럼으로 설정합니다.예를 들어 다음과 같습니다.

CREATE TABLE example_table (
  created TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
  updated_at TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP
);

다음 조회를 실행하는 경우:

INSERT INTO example_table (created) VALUES (null);

created을 사용법MySQL my my my my my 。

장점:

  • 과잉 트리거는 없습니다.

§ 로우백:

  • 데이터베이스 측과 클라이언트 애플리케이션 측에서의 변경일 관리 구현

4. 열에 날짜 자동 초기화를 사용하고 트리거를 사용하여 열을 채울있습니다.예를 들어 다음과 같습니다.

CREATE TABLE example_table (
  created TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
  updated_at TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP
);

DELIMITER //
CREATE TRIGGER example_table_set_created_date
BEFORE INSERT
   ON example_table FOR EACH ROW
BEGIN
   SET NEW.created = CURRENT_TIMESTAMP();
END; //    
DELIMITER;

장점:

  • 데이터베이스 측에서 수정 날짜 관리 구현

§ 로우백:

  • 많은 과잉 트리거가 있습니다.N개의 테이블에 대해 N개의 트리거를 생성합니다.

이것에 대한 트리거를 작성할 수 있습니다.

DELIMITER //

CREATE TRIGGER user_prefs_before_insert
BEFORE INSERT
   ON user_prefs FOR EACH ROW

BEGIN
   SET NEW.updated = new.created;
END; //

DELIMITER ;

업데이트를 위한 다른 트리거

DELIMITER //

CREATE TRIGGER user_prefs_before_update
BEFORE UPDATE
   ON user_prefs FOR EACH ROW

BEGIN
   SET NEW.updated = CURRENT_TIMESTAMP();
END; //

DELIMITER ;

언급URL : https://stackoverflow.com/questions/54350419/mariadb-mysql-setting-current-timestamp-on-create-and-changing-noting-on-update