MySQL Datetime 열의 기본값을 어떻게 설정합니까?
SQL Server에서는 getdate()
입니다. MySQL에 해당하는 것은 무엇입니까? 그것이 사실이라면 MySQL 5.x를 사용하고 있습니다.
MySQL Datetime 열의 기본값을 어떻게 설정합니까?
SQL Server에서는 getdate()
입니다. MySQL에 해당하는 것은 무엇입니까? 그것이 사실이라면 MySQL 5.x를 사용하고 있습니다.
답변:
중요 편집 : 이제 MySQL 5.6.5 부터 DATETIME 필드를 사용 하여이 작업을 수행 할 수 있습니다. 아래 의 다른 게시물을 살펴보십시오 ...
이전 버전은 DATETIME으로 할 수 없습니다 ...
그러나 TIMESTAMP로 할 수 있습니다.
mysql> create table test (str varchar(32), ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)
mysql> desc test;
+-------+-------------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+-------------------+-------+
| str | varchar(32) | YES | | NULL | |
| ts | timestamp | NO | | CURRENT_TIMESTAMP | |
+-------+-------------+------+-----+-------------------+-------+
2 rows in set (0.00 sec)
mysql> insert into test (str) values ("demo");
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+------+---------------------+
| str | ts |
+------+---------------------+
| demo | 2008-10-03 22:59:52 |
+------+---------------------+
1 row in set (0.00 sec)
mysql>
**주의 : CURRENT_TIMESTAMP ON을 기본으로 설정 한 열을 정의하는 경우 항상이 열의 값을 지정해야합니다. 그렇지 않으면 값이 업데이트시 자동으로 "now ()"로 재설정됩니다. 즉, 값을 변경하지 않으려면 UPDATE 문에 "[열 이름] = [열 이름]"(또는 다른 값)이 포함되어 있거나 값이 "now ()"가됩니다. 이상하지만 사실입니다. 이게 도움이 되길 바란다. 5.5.56-MariaDB를 사용하고 있습니다 **
DATE
열의 기본값을 가질 수 있습니까? ( datetime
열이 아님).
버전 5.6.5에서는 날짜 시간 열에 기본값을 설정하고 행이 업데이트 될 때 업데이트 될 열을 만들 수도 있습니다. 타입 정의 :
CREATE TABLE foo (
`creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP
)
참조 : http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
MySQL ( 버전 5.6.5 이전 )에서는 기본 DateTime 값에 함수를 사용할 수 없습니다. TIMESTAMP는 이상한 동작으로 인해 적합하지 않으므로 입력 데이터로 사용하지 않는 것이 좋습니다. ( MySQL 데이터 형식 기본값을 참조하십시오 .)
즉, Trigger를 생성하여 이를 수행 할 수 있습니다 .
DateTime 유형의 DateCreated 필드가있는 테이블이 있습니다. "Before Insert"및 " SET NEW.DateCreated=NOW()
" 테이블에서 트리거를 작성했으며 훌륭하게 작동합니다.
나는 이것이 누군가를 돕기를 바랍니다.
IF NEW.created_at IS NOT NULL
나를 위해 방아쇠 접근 방식이 가장 효과적이지만 접근 방식으로 걸림돌을 발견했습니다. 삽입시 날짜 필드를 현재 시간으로 설정하는 기본 트리거를 고려하십시오.
CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
FOR EACH ROW SET NEW.dateAdded = NOW();
이것은 일반적으로 훌륭하지만 INSERT 문을 통해 필드를 수동으로 설정한다고 가정하십시오.
INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');
트리거가 필드에 제공된 값을 즉시 덮어 쓰므로 현재가 아닌 시간을 설정하는 유일한 방법은 후속 UPDATE 문입니다. 값이 제공 될 때이 동작을 무시하려면 IFNULL 연산자를 사용하여 약간 수정 된 트리거를 시도하십시오.
CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());
이렇게하면 두 가지 이점을 모두 누릴 수 있습니다. 날짜 열에 값을 제공 할 수 있으며, 그렇지 않으면 현재 시간이 기본값이됩니다. 테이블 정의에서 DEFAULT GETDATE ()와 같은 깨끗한 것에 비해 여전히 빈민가이지만 점점 가까워지고 있습니다!
NULL
. 더 이상 경고가 없습니다.
dateAdded
모든 '0000-00-00 00:00:00'이 표시됩니다. 이를 사용하여 트릭을 수행합니다.`각 행의 경우 NEW.dateAdded = 0 THEN SET NEW.dateAdded = NOW (); END IF;`
두 개의 날짜 시간 필드가있는 테이블 에서이 alter 문을 사용 하여이 문제를 해결할 수있었습니다.
ALTER TABLE `test_table`
CHANGE COLUMN `created_dt` `created_dt` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
CHANGE COLUMN `updated_dt` `updated_dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
now () 함수가 작동 할 것으로 예상되는대로 작동합니다. 널을 삽입하거나 created_dt 및 updated_dt 필드를 무시하면 두 필드 모두에 완벽한 시간 소인 값이 생성됩니다. 행을 업데이트하면 updated_dt가 변경됩니다. MySQL 쿼리 브라우저를 통해 레코드를 삽입하는 경우 새 타임 스탬프를 사용하여 created_dt를 처리하는 트리거가 한 단계 더 필요합니다.
CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
FOR EACH ROW SET NEW.created_dt = NOW();
트리거는 이름 지정 규칙 [trig] _ [my_table_name] _ [insert]과 같이 원하는대로 지정할 수 있습니다.
트리거를 사용하여 이러한 유형의 작업을 수행 할 수 있습니다.
CREATE TABLE `MyTable` (
`MyTable_ID` int UNSIGNED NOT NULL AUTO_INCREMENT ,
`MyData` varchar(10) NOT NULL ,
`CreationDate` datetime NULL ,
`UpdateDate` datetime NULL ,
PRIMARY KEY (`MyTable_ID`)
)
;
CREATE TRIGGER `MyTable_INSERT` BEFORE INSERT ON `MyTable`
FOR EACH ROW BEGIN
-- Set the creation date
SET new.CreationDate = now();
-- Set the udpate date
Set new.UpdateDate = now();
END;
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
-- Set the udpate date
Set new.UpdateDate = now();
END;
MySQL 에서 기본 DATETIME 값 을 설정하려고하는 마음을 잃은 모든 사람들에게 , 나는 당신이 어떻게 느끼고 느끼는지 정확하게 알고 있습니다. 여기 있습니다 :
ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
조심스럽게 관찰 나는 따옴표 / 큰 따옴표 추가하지 않은 주위에 공을
나는 이것을 해결 한 후 말 그대로 뛰어 오르고있다 : D
ALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;
ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
이미 테이블을 만든 경우 사용할 수 있습니다
기본값을 현재 날짜 시간으로 변경하려면
ALTER TABLE <TABLE_NAME>
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
기본값을 '2015-05-11 13:01:01'로 변경하려면
ALTER TABLE <TABLE_NAME>
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT '2015-05-11 13:01:01';
이것은 참으로 끔찍한 소식입니다. 여기에 오랫동안 보류중인 버그 / 기능 요청이 있습니다. 또한이 설명에서는 타임 스탬프 데이터 유형의 한계에 대해 설명합니다.
이 일을 구현하는 데 어떤 문제가 있는지 궁금합니다.
MySql Server 5.7.11을 실행 중이며이 문장은 다음과 같습니다.
ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
한다 하지 작업. 그러나 다음은
ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
그냥 작동합니다 .
A와 (!) 참고 , 그것은에서 언급 MySQL의 문서 :
DATE 유형은 날짜 부분은 있지만 시간 부분은없는 값에 사용됩니다. MySQL은 YYYY-MM-DD 형식으로 DATE 값을 검색하여 표시합니다. 지원되는 범위는 '1000-01-01'~ '9999-12-31'입니다.
그들이 또한 말하더라도 :
유효하지 않은 DATE, DATETIME 또는 TIMESTAMP 값은 해당 유형 ( '0000-00-00'또는 '0000-00-00 00:00:00')의“0”값으로 변환됩니다.
now ()를 사용하여 날짜 시간 열의 값을 설정할 수 있지만이 값을 기본값으로 사용할 수는 없습니다.
NOW()
나중에 삽입에 사용하십시오. 버전 5.6의 경우 단순히 NOW()
기본값으로 설정 하십시오.
TIMESTAMP 열을 솔루션으로 사용하는 모든 사람들에게 매뉴얼에서 다음과 같은 제한을 두 번째로하고 싶습니다.
http://dev.mysql.com/doc/refman/5.0/en/datetime.html
"TIMESTAMP 데이터 형식의 범위는 '1970-01-01 00:00: 01'UTC 에서 ' 2038-01-19 03:14:07'UTC까지 입니다. MySQL 버전 및 SQL에 따라 다양한 속성이 있습니다. 서버가 실행중인 모드입니다.이 등록 정보는이 섹션의 뒷부분에서 설명합니다. "
따라서 이것은 약 28 년 안에 소프트웨어를 깨뜨릴 것입니다.
데이터베이스 쪽의 유일한 해결책은 다른 답변에서 언급 한 것처럼 트리거를 사용하는 것입니다.
다중 라인 트리거를 정의하는 동안 세미콜론이 트리거의 끝으로 MySQL 컴파일러에 의해 취해져 오류가 발생하므로 구분 기호를 변경해야합니다. 예 :
DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
-- Set the udpate date
Set new.UpdateDate = now();
END//
DELIMITER ;
MySQL 5.1에서이를 수행하는 방법은 다음과 같습니다.
ALTER TABLE `table_name` CHANGE `column_name` `column_name`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
열 이름을 두 번 입력 해야하는 이유는 없습니다.
예를 들어 DATETIME과 created_at 및 update_at 열이있는 'site'라는 테이블이 있고 기본값이 지금 필요한 경우 다음 SQL을 실행하여이를 수행 할 수 있습니다.
ALTER TABLE`site` CHANGE`created_at``created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; ALTER TABLE`site` CHANGE`created_at``created_at` DATETIME NULL DEFAULT NULL; ALTER TABLE`site` CHANGE`updated_at``updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; ALTER TABLE`site` CHANGE`updated_at``updated_at` DATETIME NULL DEFAULT NULL;
테이블은 기본값이 CUREENT TIMESTAMP 인 TIMESTAMP 유형의 두 열을 가질 수 없으므로 명령문 순서가 중요합니다.
이것은 내 트리거 예입니다.
/************ ROLE ************/
drop table if exists `role`;
create table `role` (
`id_role` bigint(20) unsigned not null auto_increment,
`date_created` datetime,
`date_deleted` datetime,
`name` varchar(35) not null,
`description` text,
primary key (`id_role`)
) comment='';
drop trigger if exists `role_date_created`;
create trigger `role_date_created` before insert
on `role`
for each row
set new.`date_created` = now();
MySQL 8.x와 잘 작동
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dateCreated` datetime DEFAULT CURRENT_TIMESTAMP,
`dateUpdated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `mobile_UNIQUE` (`mobile`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
기본 타임 스탬프를 해결할 수 있습니다. 예를 들어 u를 utf8로 취한 경우이 문자 세트가 모든 언어를 지원하고 1을 늦게 사용한 경우이 문자 세트는 영어 만 지원하는 문자 세트를 먼저 고려하십시오. 다음 프로젝트에서 작업하는 경우 클라이언트 시간대를 알고 클라이언트 시간대를 선택하십시오. 이 단계는 필수입니다.