792

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

SQL Server에서getdate(). MySQL에 상응하는 것은 무엇입니까? MySQL 5.x를 사용하고 있습니다.


  • 내 CURRENT_TIMESTAMP 내 mysql 테이블에 (쿼리에서), 어쩌면이 유용 할 수 있습니다. - Ruben
  • 이 기능은 MySQL 5.6.5에 추가되었습니다. 희망이 사람을 도움이됩니다.optimize-this.blogspot.co.uk/2012/04/… - GhostInTheSecureShell
  • @GhostInTheSecureShell 데비안에 적어도 임무를 설치하는 임무가 있지만, 정말 멋진 기능입니다. 결국이 모든 "2 CURRENT_TIMESTAMP" 질문은 완화 될 것입니다! - Marc DiMillo

24 답변


778

중요한 편집 :DATETIME 필드를 사용하여이를 달성 할 수 있습니다.MySQL 5.6.5,다른 게시물이하...

이전 버전에서는 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 문에 "[your column name] = [your column name]"(또는 다른 값)이 있어야하며 그렇지 않으면 값이 "now ()"가됩니다. 이상하지만 진실입니다. 이게 도움이 되길 바란다. 나는 5.5.56-MariaDB를 사용하고있다 **


  • datetime의 범위는 1000-9999이지만타임 스탬프의 범위는 1970-2038 년입니다.. 시스템이 생년월일을 저장해야하거나 30 년짜리 모기지에 대한 지불 계획과 같은 것을 처리해야하는 경우 문제가 될 수 있습니다.dev.mysql.com/doc/refman/5.0/en/datetime.html - Kip
  • timestamp로 마술처럼 자동 갱신되는만큼 carefull도 ...stackoverflow.com/a/1483959/233906 - Cerber
  • 그것~이다.5.6.5 버전에서 가능합니다, 아래 Gustav의 답변을보십시오 (MySQL이 여전히 5.0 일 때 당신의 답변이 게시되었음을 알고 있습니다!) - Ring Ø
  • @Kip, 안녕하세요, 기본 값을 가질 수 있습니까?DATE기둥? (datetime기둥). - Sajib Acharya
  • DATE 열에는 DATETIME 데이터 유형을 사용해야합니다. - Fabio Napodano

514

버전 5.6.5에서는 datetime 열에 기본값을 설정하고 행을 업데이트 할 때 업데이트 할 열을 만들 수도 있습니다. 타입 정의 :

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


  • & # 39; menu_creation_time & # 39;에 대한 기본값이 잘못되었습니다. - Fernando Trindade
  • @FernandoTrindade MySQL 버전 5.6.5 이상이 필요합니다. 당신은 그것을 여기서 볼 수 있습니다 :sqlfiddle.com/#!9/dd2be - Gustav Bertram
  • @ GustavBertram, 버전 5.6.22 사용하고 있지만 여전히 다음과 같은 오류가 있습니다 : CREATE TABLE tbl (InsertDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, UpdateDate TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP (6)); 오류 코드 : 1294. & # 39; UpdateDate & # 39;에 대한 올바르지 않은 ON UPDATE 절. 기둥 - Manish Sapkal
  • @ManishSapkal DATETIME이 아닌 TIMESTAMP를 사용하고 있습니다. 또한 NULL로 설정하지 마십시오. - Gustav Bertram
  • 그냥 메모 -이 작동하지 않습니다date - Nick

139

MySQL (버전 5.6.5 이전) 함수는 기본 DateTime 값에 사용할 수 없습니다. TIMESTAMP는 비정상적인 작동으로 인해 적합하지 않으며 입력 데이터로 사용하기 위해 권장되지 않습니다. (만나다MySQL 데이터 유형 기본값.)

즉, 이렇게 할 수 있습니다.트리거 생성.

DateTime 형식의 DateCreated 필드가있는 테이블이 있습니다. 나는 그 테이블에 "Before Insert"와 "SET NEW.DateCreated=NOW()"잘 작동합니다.

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


  • CREATE TRIGGER trigger_foo_SetCreatedAt 각 행에 대해 foo를 INSERT하기 전에 SET NEW.created_at = UTC_TIMESTAMP (); - kgriffs
  • 향후 보안 (유지 관리)을 위해 트리거보다 타임 스탬프를 사용하는 것이 좋습니다. 이것은 해결책이지만 트리거에 대한 사용 사례는 너무 사소한 것입니다. - getWeberForStackExchange
  • 기본값을 설정하는 것이 좋습니다.IF NEW.created_at IS NOT NULL - Petr Peller

129

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

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 문입니다 (yuck! 값이 제공 될 때이 동작을 무시하려면 IFNULL 연산자를 사용하여 약간 수정 된 트리거를 시도하십시오.

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());

이것은 두 세계의 장점을 제공합니다. 날짜 열의 값을 제공 할 수 있으며 그 값은 현재 시간으로 설정됩니다. 테이블 정의에서 DEFAULT GETDATE ()처럼 깨끗한 것과 관련하여 여전히 빈민굴이지만, 점점 더 가까워지고 있습니다!


  • 삽입시 명백한 사용자 값을 덮어 쓰면서 경고를 인정하는 경우 +1. - Kip
  • 개인적으로 이것이 최선의 방법이라고 생각합니다. TIMESTAMP 실제로 참 이상한 행동을하고 2038 년 제한이 코드를 작성하지 것입니다. - Eric
  • 신경 쓰지 마, 알아 냈어. 허용 할 필드를 설정하는 것을 잊었습니다.NULL. 더 이상 경고가 없습니다. - Kaji
  • 방아쇠는 악합니다! 다른 방법으로 무언가를 할 수 없을 때만 사용하십시오. ID를 5.6.x로 업그레이드하는 것이 더 나은 경우 트리거를 사용할 수 있습니다. - ksymeon
  • MySQL 5.5에서는 IFNULL이 DATETIME에 대해 작동하지 않습니다. 위의 트리거를 사용하여dateAdded모든 0000-00-00 00 : 00 : 00 & # 39;이 (가) 표시됩니다. 이것을 사용하면 다음과 같은 트릭을 수행하게됩니다 :`FOR EACH ROW IF NEW.dateAdded = 0 THEN SET NEW.dateAdded = NOW (); END IF; - Kenney

23

두 datetime 필드가있는 내 테이블에이 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 () 함수가 작동 할 것으로 기대하는 것처럼 작동합니다. null을 삽입하거나 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]


  • 삽입 () 문을 사용하지 않고 그리드를 통해 MySQL 쿼리 브라우저를 통해 레코드를 수동으로 삽입하면 트리거가 필요합니다. 항상 insert 문을 사용하면 트리거가 완전히 필요하지 않습니다. - user188217
  • 와! 나는 트리거 이름이 기능에 전혀 영향을 미치지 않기 때문에 원하는 트리거가 될 수 있습니다. 대부분의 사람들은 그것을 알게 될 것이지만, MySQL을 처음 접하는 사람들은 모를 수도 있습니다 ... - user188217
  • Yikes, 줄 바꿈의 부족에 대해 유감스럽게 생각합니다. 세미콜론을 사용하여 각 줄의 끝을 표시하십시오. - user188217
  • 이것은 Mysql 5.5의 해결 방법으로 작동합니다. 감사 - Aakash

22

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

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;


15

마음을 놓치고 불이행을 설정하려는 모든 사람들에게날짜 시간~의 가치MySQL, 나는 네가 어떻게 느끼고 / 느꼈는지 정확하게 안다. 그래서 여기 있습니다 :

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

조심스럽게 관찰하십시오.작은 따옴표 / 큰 따옴표를 추가하지 않았습니다.주위의

나는이 문제를 해결 한 후 문자 그대로 뛰어 오르고있다 : D


  • 현재 시간을 삽입하지 않습니다. '0000-00-00 00 : 00 : 00 & # 39; . - Pit Digger
  • 나는 그것이 현재 시간을 설정한다고 말하지 않았다. 많은 ppl이 디폴트 0 값을 설정하려했으나 작동하지 않습니다. 따옴표를 제거해야합니다. 이 발견은 많은 시간과 좌절을 야기 했으므로 커뮤니티와 공유하는 것을 생각했습니다. 당신 같은 사람들은 다른 사람들과 유용한 정보를 공유하는 것에 대한 관심을 잃어 버리는 사용자에 대한 책임이 있습니다. 나는 진지하게 -1을 얻는 어떤 이유도 보지 않는다! 도대체 무엇이. - Augiwan
  • DATETIME NOT NULL로 동일한 결과를 얻을 수 있습니다. - Brendan Byrd
  • 예제 sql 명령에는`문자가 하나 더 있습니다. 편집 할 수 없습니다. 한 문자 만 편집 할 수 있기 때문입니다. - quapka

13

MySQL 5.6에서이 문제가 해결되었습니다..

ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'


12

이것은 참으로 끔찍한 소식입니다.여기에 오랫동안 대기중인 버그 / 기능 요청이 있습니다.. 이 토론에서는 타임 스탬프 데이터 유형의 한계에 대해서도 설명합니다.

나는 심각 하게이 일을 구현 점점 문제가 궁금 해서요.



8

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

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

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


7

솔루션으로 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 년 동안 귀하의 소프트웨어를 분명히 망칠 것입니다.

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


  • 20 년 후 MySQL이 업데이트되고 그 제한이 제거되면 어떻게 될까요? 그게 가능할지 모르겠는지 모르겠습니다. - NessDan

7

멀티 라인 트리거를 정의하는 동안 세마 콜론 (semicolon)은 트리거의 끝으로 MySQL 컴파일러에서 취해서 오류를 생성하므로 구분 기호를 변경해야합니다. 예 :

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


6

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


  • 참된. 방금 사용하려고 시도했지만 & quot; 오류 코드 : 1067. 잘못된 기본값입니다. & quot; 오류가 발생했습니다. 그래서 대답은 무엇입니까? ;-) - Brian Boatright
  • 이것은 MySQL 버전 5.5와 5.6의 절충을위한 최상의 솔루션입니다. 버전 5.5의 경우, 값을 미리 결정하십시오.NOW()삽입을 위해 나중에 사용하십시오. 버전 5.6의 경우 간단히 설정합니다.NOW()기본값으로 사용합니다. - Abel Callejo

6

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'

그냥 일한다..

마찬가지로, 그것은mysql 워드 프로세서:

DATE 유형은 날짜 부분은 있지만 시간 부분은없는 값에 사용됩니다. MySQL은 DATE 값을 검색하고 'YYYY-MM-DD'형식으로 표시합니다. 지원되는 범위는 '1000-01-01'에서 '9999-12-31'입니다.

심지어 그들이 말하는 경우에도 :

유효하지 않은 DATE, DATETIME 또는 TIMESTAMP 값은 적절한 유형 ( '0000-00-00'또는 '0000-00-00 00:00:00')의 "0"값으로 변환됩니다.


5

네가 할 수는 없지만DATETIME기본 정의에서 select 문을 insert 문에 다음과 같이 간단하게 통합 할 수 있습니다.

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

테이블 주위에 따옴표가 없음을 유의하십시오.

MySQL 5.5의 경우


  • 지금 (select now ()) 대신 now ()가 충분합니다. - dimus

4

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

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

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


  • CHANGE는 필드의 이름을 바꾸기위한 것입니다. 첫 번째 열 이름은 & amp; old & # 39이고 두 번째 열 이름은 & # 39; 새 & # 39;입니다. 입력란의 이름을 변경하지 않으면 중복 된 것으로 보입니다. 너무 심미적으로 불쾌감을주는 경우 MODIFY를 시도하십시오. - John Gordon

3

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


2

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

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


2

다음 코드를 사용하십시오.

DELIMITER $$

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

    DELIMITER ;


2

mysql inbuilt 함수는 현재 시간 (삽입 시간)을 알려주는 now ()를 호출하기 때문에 mysql에서 간단하다고 생각한다.

따라서 검색어는 유사하게 보입니다.

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

고맙습니다.


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;

테이블에 TIMESTAMP 유형의 두 개의 C 럼이있을 수 없으 G로 명령문의 순서가 중요합니다 (기본값은 CUREENT 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();


-2

기본 시간 소인을 해결할 수 있습니다. 먼저 어떤 문자 집합을 사용하는지 고려해보십시오. 예를 들어 U를 취한 경우이 문자 집합은 모든 언어를 지원하고 u는 laten1을 취하면이 문자 집합은 영어 만 지원합니다. 다음 프로젝트라면 클라이언트 시간대를 알아야하고 클라이언트 영역을 선택해야합니다. 이 단계는 필수 항목입니다.


  • DateTime 열은 기본값을 가질 수 없습니다. 문서의 & # 39; 기능 & # 39; 모든 개발자가 문자 인코딩을 변경할 수있는 권한이 없습니다. 그리고 서버를 설정합니다.고객시간대는 일반적으로 불가능합니다. 특히 클라이언트가 모든 단일 시간대 지역의 출생지가 아닌 경우 특히 그렇습니다. - rlb.usa

연결된 질문


관련된 질문

최근 질문