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
'source' 카테고리의 다른 글
PHP에는 데이터 구조가 내장되어 있습니까? (0) | 2023.01.17 |
---|---|
JavaScript의 "with" 스테이트먼트에 정당한 용도가 있습니까? (0) | 2023.01.17 |
MariaDB와 MySQL의 불일치 (0) | 2023.01.17 |
개체의 정규화되지 않은(짧은) 클래스 이름을 가져오려면 어떻게 해야 합니까? (0) | 2023.01.17 |
MySql과의 연결이 자동으로 중단됩니다.커넥터/J를 올바르게 설정하는 방법 (0) | 2023.01.17 |