MySQL Datetime 열의 기본값을 어떻게 설정합니까?


898

MySQL Datetime 열의 기본값을 어떻게 설정합니까?

SQL Server에서는 getdate()입니다. MySQL에 해당하는 것은 무엇입니까? 그것이 사실이라면 MySQL 5.x를 사용하고 있습니다.


4
mysql 테이블에서 CURRENT_TIMESTAMP를 사용하지만 쿼리에 유용하지 않을 수도 있습니다.
Ruben

15
이 기능은 이제 MySQL 5.6.5에 추가되었습니다. 이것이 누군가를 돕기를 바랍니다. optimize-this.blogspot.co.uk/2012/04/…
GhostInTheSecureShell

@GhostInTheSecureShell 최소한 데비안에서 설치하는 임무는 있지만 멋진 기능입니다. 결국이 "두 CURRENT_TIMESTAMP"질문이 모두 완화 될 것입니다.
Marc DiMillo

now () 함수이거나 그렇지 않으면 열 수준의 기본 설정으로 할 수 있습니다.
Anshul Sharma

답변:


862

중요 편집 : 이제 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를 사용하고 있습니다 **


400
datetime의 범위는 1000-9999이지만 타임 스탬프의 범위는 1970-2038에 불과합니다 . 시스템에서 생년월일을 저장해야하거나 30 년 모기지에 대한 지불 계획과 같은 것을 처리해야하는 경우 문제가 될 수 있습니다. dev.mysql.com/doc/refman/5.0/en/datetime.html
Kip

13
타임 스탬프도주의해서 자동 업데이트되므로주의하십시오. 다음 답변 참조 stackoverflow.com/a/1483959/233906
Cerber

6
이다 버전 5.6.5에서, 아래 구스타프의 답변을 볼 수있다 (나는 MySQL은 여전히 5.0 때 답변을 게시했습니다 실현!)
E2-E4

4
@Kip, Hi, DATE열의 기본값을 가질 수 있습니까? ( datetime열이 아님).
Sajib Acharya

TI는 날짜 열에 가능하지 않는 것 : 당신이 DATETIME 데이터 형식을 사용해야합니다
파비오 Napodano

598

버전 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


3
'menu_creation_time'의 잘못된 기본값
Fernando Trindade

2
@FernandoTrindade MySQL 버전 5.6.5 이상이 필요합니다. 여기에서 작동하는 것을 볼 수 있습니다 : sqlfiddle.com/#!9/dd2be
Gustav Bertram

1
@GustavBertram, 버전 5.6.22를 사용하고 있지만 여전히 다음과 같은 오류가 발생합니다. CREATE TABLE tbl (InsertDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, UpdateDate TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP (6)); 오류 코드 :
1294.

@ManishSapkal DATETIME이 아니라 TIMESTAMP를 사용하고 있습니다. 또한 NULL로 만들지 마십시오.
구스타프 버트 램

1
"ON UPDATE"구문이 잘못되었다고 생각합니다. 따르면합니다 dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html 그것이 있어야dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
댄 큰 가지

148

MySQL ( 버전 5.6.5 이전 )에서는 기본 DateTime 값에 함수를 사용할 수 없습니다. TIMESTAMP는 이상한 동작으로 인해 적합하지 않으므로 입력 데이터로 사용하지 않는 것이 좋습니다. ( MySQL 데이터 형식 기본값을 참조하십시오 .)

즉, Trigger를 생성하여 이를 수행 할 수 있습니다 .

DateTime 유형의 DateCreated 필드가있는 테이블이 있습니다. "Before Insert"및 " SET NEW.DateCreated=NOW()" 테이블에서 트리거를 작성했으며 훌륭하게 작동합니다.

나는 이것이 누군가를 돕기를 바랍니다.


21
각 행 세트에 대해 foo에 삽입하기 전에 트리거 생성 trigger_foo_SetCreatedA. NEW.created_at = UTC_TIMESTAMP ();
kgriffs

5
미래 온전함 (유지 관리)을위한 트리거보다 타임 스탬프를 사용하는 것이 좋습니다. 솔루션이지만 트리거의 사용 사례는 너무 사소합니다.
getWeberForStackExchange

8
당신은 아마 기본값을 설정하고 싶을 것입니다IF NEW.created_at IS NOT NULL
Petr Peller

132

나를 위해 방아쇠 접근 방식이 가장 효과적이지만 접근 방식으로 걸림돌을 발견했습니다. 삽입시 날짜 ​​필드를 현재 시간으로 설정하는 기본 트리거를 고려하십시오.

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 ()와 같은 깨끗한 것에 비해 여전히 빈민가이지만 점점 가까워지고 있습니다!


5
삽입시 명시적인 사용자 값을 덮어 써서 경고를 승인 한 경우 +1입니다.
Kip

2
개인적으로는 이것이 최선의 방법이라고 생각합니다. TIMESTAMP는 실제로 이상한 행동을하며 2038 년 제한이있는 코드를 작성하지 않습니다.
Eric

신경 쓰지 마, 알아 냈어 필드를 허용하도록 설정하지 않았습니다 NULL. 더 이상 경고가 없습니다.
Kaji

방아쇠는 악하다! 다른 방법이없는 경우에만 사용하십시오. 트리거를 사용하는 것보다 5.6.x ID로 업그레이드하는 것이 좋습니다.
ksymeon

4
MySQL 5.5에서는 IFNULL이 DATETIME에 작동하지 않습니다. 위의 트리거를 사용하면 dateAdded모든 '0000-00-00 00:00:00'이 표시됩니다. 이를 사용하여 트릭을 수행합니다.`각 행의 경우 NEW.dateAdded = 0 THEN SET NEW.dateAdded = NOW (); END IF;`
Kenney 2016 년

28

두 개의 날짜 시간 필드가있는 테이블 에서이 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]과 같이 원하는대로 지정할 수 있습니다.


insert () 문없이 그리드를 통해 MySQL 쿼리 브라우저를 통해 레코드를 수동으로 삽입하는 경우 트리거가 필요합니다. 항상 insert 문을 사용하면 트리거가 완전히 필요하지 않습니다.

으악! 트리거 이름이 기능에 전혀 영향을 미치지 않기 때문에 트리거 (이름)를 원하는대로 지정할 수 있습니다. ... 대부분의 사람들은 알고하지만, MySQL의 새로운 일부 사람들은 모를 수도

줄 바꿈이 없기 때문에 죄송합니다. 세미콜론을 사용하여 각 줄의 끝을 표시하십시오.

24

트리거를 사용하여 이러한 유형의 작업을 수행 할 수 있습니다.

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;

18

MySQL 에서 기본 DATETIME 값 을 설정하려고하는 마음을 잃은 모든 사람들에게 , 나는 당신이 어떻게 느끼고 느끼는지 정확하게 알고 있습니다. 여기 있습니다 :

ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

조심스럽게 관찰 나는 따옴표 / 큰 따옴표 추가하지 않은 주위에 공을

나는 이것을 해결 한 후 말 그대로 뛰어 오르고있다 : D


8
현재 시간이 아닌 삽입하지 않습니다. '0000-00-00 00:00:00'을 삽입합니다.
Pit Digger

8
나는 그것이 현재 시간을 설정한다고 말하지 않았다. 많은 ppl이 기본 0 값을 설정하려고했지만 작동하지 않습니다. 따옴표를 제거해야합니다. 이 결과가 많은 시간과 좌절을 초래했기 때문에 커뮤니티와 공유하는 것을 생각했습니다. 귀하와 같은 사람들은 다른 사람들과 유용한 정보를 공유하는 데 관심이없는 사용자에 대한 책임이 있습니다. 나는 진지하게 -1을 얻는 이유를 보지 못한다! 도대체 무엇이.
Augiwan

3
DATETIME NOT NULL로도 동일한 결과를 얻을 수 있습니다.
Brendan Byrd

sql 명령 예제 안에`문자가 하나 더 있는데, 한 문자 만 편집하기 때문에 편집 할 수 없습니다.
quapka

귀하의 코드가 나를 위해 작동하지 ALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;
Smith


14

이미 테이블을 만든 경우 사용할 수 있습니다

기본값을 현재 날짜 시간으로 변경하려면

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';


9

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”값으로 변환됩니다.


8

now ()를 사용하여 날짜 시간 열의 값을 설정할 수 있지만이 값을 기본값으로 사용할 수는 없습니다.


4
진실. 방금 지금 사용해 보았고 "오류 코드 : 1067. 잘못된 기본값"오류가 발생했습니다. 그래서 대답은 무엇입니까? ;-)
Brian Boatright

이것은 MySQL 버전 5.5 및 5.6을 손상시키기위한 최상의 솔루션입니다. 버전 5.5의 경우, 값을 미리 결정하고 NOW()나중에 삽입에 사용하십시오. 버전 5.6의 경우 단순히 NOW()기본값으로 설정 하십시오.
Abel Callejo

8

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 년 안에 소프트웨어를 깨뜨릴 것입니다.

데이터베이스 쪽의 유일한 해결책은 다른 답변에서 언급 한 것처럼 트리거를 사용하는 것입니다.


2
MySQL이 20 년 후에 업데이트되고 해당 제한이 제거되면 어떻게됩니까? 그것이 가능한지 확실하지 않지만 단지 생각입니다.
NessDan

7

다중 라인 트리거를 정의하는 동안 세미콜론이 트리거의 끝으로 MySQL 컴파일러에 의해 취해져 오류가 발생하므로 구분 기호를 변경해야합니다. 예 :

DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END//
DELIMITER ;

5

MySQL 5.1에서이를 수행하는 방법은 다음과 같습니다.

ALTER TABLE `table_name` CHANGE `column_name` `column_name` 
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

열 이름을 두 번 입력 해야하는 이유는 없습니다.


5
CHANGE는 또한 필드 이름을 변경하기위한 것입니다. 첫 번째 열 이름은 'old'이고 두 번째 열 이름은 'new'입니다. 필드 이름을 변경하지 않으면 중복으로 보입니다. 심미적으로 기분이 좋지 않으면 MODIFY를 시도하십시오.
John Gordon

5

DATETIME기본 정의에서는 이 작업을 수행 할 수 없지만 다음과 같이 select 문을 insert 문에 간단히 통합 할 수 있습니다.

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))

표 주위에 따옴표가 없습니다.

MySQL 5.5의 경우


3

기본값을 NOW ()로 설정하려고하면 MySQL이 지원하지 않는다고 생각합니다. MySQL에서는 CURRENT_TIMESTAMP를 기본값으로 지정할 수있는 TIMESTAMP 데이터 유형 열을 제외하고 함수 또는 표현식을 모든 유형의 열에 대한 기본값으로 사용할 수 없습니다.


3

mysql부터 now ()라는 내장 함수를 사용하면 현재 시간 (삽입 시간)을 제공하는 mysql에서 간단하다고 생각합니다.

따라서 쿼리는 비슷하게 보일 것입니다

CREATE TABLE defaultforTime(
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME default now()
);

감사합니다.


2
CREATE TABLE `testtable` (
    `id` INT(10) NULL DEFAULT NULL,
    `colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12'
)

위의 쿼리에서 'testtable'을 만들 때 DATETIME 열의 기본값으로 '1999-12-12 12:12:12'를 사용했습니다. colname


1

다음 코드를 사용하십시오

DELIMITER $$

    CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
    BEGIN
      SET new.datefield = NOW();
    END $$

    DELIMITER ;

0

기본값을 NOW ()로 설정하려는 경우 MySQL은 DATETIME 대신 해당 열 TIMESTAMP의 유형을 변경해야 함을 지원합니다. TIMESTAMP는 현재 날짜와 시간을 기본값으로 사용합니다. 문제가 해결 될 것이라고 생각합니다.


0

예를 들어 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 유형의 두 열을 가질 수 없으므로 명령문 순서가 중요합니다.


0

이것은 내 트리거 예입니다.

/************ 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();


0

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;

-3

기본 타임 스탬프를 해결할 수 있습니다. 예를 들어 u를 utf8로 취한 경우이 문자 세트가 모든 언어를 지원하고 1을 늦게 사용한 경우이 문자 세트는 영어 만 지원하는 문자 세트를 먼저 고려하십시오. 다음 프로젝트에서 작업하는 경우 클라이언트 시간대를 알고 클라이언트 시간대를 선택하십시오. 이 단계는 필수입니다.


2
DateTime 열은 기본값을 가질 수 없습니다. '기능'이 문서화되어 있습니다. 모든 개발자가 문자 인코딩을 변경할 수있는 것은 아닙니다. 그리고 서버를 클라이언트 시간대 로 설정하는 것은 일반적으로 가능하지 않습니다. 특히 클라이언트가 모두 단일 시간대 영역에 고유하지 않은 경우.
rlb.usa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.