datetime 데이터 유형의 기본값으로 NOW ()를 설정 하시겠습니까?


197

테이블 사용자 registerDate and lastVisitDate에는 날짜 시간 데이터 형식으로 구성된 두 개의 열 이 있습니다. 다음을 수행하고 싶습니다.

  1. registerDate 기본값을 MySQL NOW ()로 설정
  2. lastVisitDate 기본값을 기본값 0000-00-00 00:00:00대신 사용하는 null 대신로 설정하십시오.

테이블이 이미 존재하고 기존 레코드가 있으므로 수정 테이블을 사용하고 싶습니다. 아래 두 가지 코드를 사용해 보았지만 작동하지 않습니다.

ALTER TABLE users MODIFY registerDate datetime DEFAULT NOW()
ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;

그것은 나에게 오류를 준다 : ERROR 1067 (42000): Invalid default value for 'registerDate'

MySQL에서 기본 날짜 시간 값을 NOW ()로 설정할 수 있습니까?


4
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP. data type두 가지 노력 모두에서 분야를 정의하지 않았습니다
Shakti Singh

3
MySQL 5.6 DATE이 기본값으로 작동 하기 때문에NOW()
AbcAeffchen

이 mysql 5.6 문서 : dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html 에 따르면 CURRENT_TIMESTAMP ()를 기본값으로 사용할 수 있습니다.
blacktie24

내가 CURRENT_TIMESTAMP + 1 DAY 구현하는 것이 방법
케르 Baltaci

답변:


241

MySQL 5.6.5부터는 DATETIME동적 기본값으로 유형을 사용할 수 있습니다 .

CREATE TABLE foo (
    creation_time      DATETIME DEFAULT   CURRENT_TIMESTAMP,
    modification_time  DATETIME ON UPDATE CURRENT_TIMESTAMP
)

또는 두 규칙을 모두 결합하십시오.

modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

참조 :
http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html
http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available .html

5.6.5 이전 TIMESTAMP에는 레코드가 수정 될 때마다 자동으로 업데이트되는 데이터 유형 을 사용해야합니다 . 그러나 불행히도 TIMESTAMP테이블 당 하나의 자동 업데이트 필드 만 존재할 수 있습니다.

CREATE TABLE mytable (
  mydate TIMESTAMP
)

참조 : http://dev.mysql.com/doc/refman/5.1/en/create-table.html

MySQL이 타임 스탬프 값을 업데이트하지 않도록하려면 UPDATE(트리거 만 트리거되도록 INSERT) 정의를 다음과 같이 변경할 수 있습니다.

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

80
정말 타임 스탬프를 사용하고 싶지 않습니다.
이브라힘 아자르 아르 마르

2
@Ibrahim : 타임 스탬프가 유일한 기회입니다. 날짜 시간 필드를 사용하는 경우 now ()를 사용하여 매번 레코드를 삽입해야합니다.
Nicola Cossu

9
Manual은 명확하게 말합니다. "예를 들어 날짜 열의 기본값을 NOW () 또는 CURRENT_DATE와 같은 함수 값으로 설정할 수 없음을 의미합니다."
Nicola Cossu

19
@Johan DATETIME은 종종 TIMESTAMPS'1970-01-01 00 과 비교하여 ' 1000-01-01 00:00:00 '에서'9999-12-31 23:59:59 '의 범위를 유지하는 것이 좋습니다 . 00:01 'UTC-'2038-01-19 03:14:07 'UTC 예를 들어 생년월일 또는 향후 30 년 이상을 저장하기 위해.
user17753

5
@nickrulez 더 이상 timestampMySQL 5.6 부터이 동작으로 제한되지 않습니다
Dan Esparza

70

새 삽입에 대해 날짜 시간 필드를 NOW ()로 설정하는 방법으로 트리거를 사용합니다.

CREATE TRIGGER `triggername` BEFORE INSERT ON  `tablename` 
FOR EACH ROW 
SET NEW.datetimefield = NOW()

업데이트도 가능합니다.

Johan & Leonardo의 답변에는 타임 스탬프 필드로 변환이 포함됩니다. 이 질문에 제시된 사용 사례 (RegisterDate 및 LastVisitDate 저장)에는 문제가 없지만 범용 솔루션은 아닙니다. 날짜 시간 대 타임 스탬프 질문을 참조하십시오 .


4
이것은 정답이어야하지만, 구체적으로 날짜 / 시간 필드에 맞게 편집해야합니다. 원래 포스터는 날짜 및 시간 필드에서이를 해결하는 방법을 알고 싶어 use a timestamp하며이 두 데이터 유형의 차이점을 실제로 배우면 어리석은 해결 방법입니다.
phpguru

45

내 솔루션

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;

이 데프는 작동합니다. 모든 사람들이 SQLYog 또는 이와 같은 도구를 사용하는 것이 좋습니다.이 인터페이스를 사용하면 쉬운 인터페이스 에서이 작업을 수행 할 수 있습니다.
불변의 벽돌

27
이것은 여전히 TIMESTAMP열 솔루션입니다 . 아무도 요구하지 않았습니다 TIMESTAMP...
Petr Peller

2
예, 이것은 질문에 대한 답변이 아닙니다. TIMESTAMP는 DATETIME과 다른 유형의 필드입니다.
존 헌트


13

유레카 !!!


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

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

0 주위 에 작은 따옴표 / 큰 따옴표를 추가하지 않았 음을주의 깊게 관찰 하십시오 .


중요 업데이트 :

이 답변은 오래 전 게시되었습니다. 그 당시에는 MySQL의 (아마도 최신) 설치에서 작동했으며 공유하고 싶어했습니다. 이 솔루션을 지금 사용하기로 결정하기 전에 아래 의견을 읽으십시오.


16
예상에 따라 다릅니다 ...-이 솔루션을 사용하면 기본값이 제공되므로 NOT NULL 필드를 가질 수 있습니다. -이 솔루션은 필드를 NOW ()로 설정하지 않습니다.
CodeReaper

10
이것은 원래의 질문에 대한 답이 아닙니다. 대답은 명확하게 명시해야합니다.
Matt Browne

2
TRADITIONAL SQL 모드에는 NO_ZERO_DATE가 포함되므로 위의 경우에는 작동하지 않습니다.
Móż

제공된 답변에 따라 DATETIME을 TIMESTAMP로 희생하지 않으면 트리거를 사용해야합니다.
Chris

1
이 솔루션은 "OMG는 ZERO 날짜입니다!이 얼마나 HERESY입니까! 우리는 'this'를 java.lang.Date/System.DateTime! OMG! -crashes-"로 변환 할 수 없습니다.
Felype


4

mysql 5.6.5 이상 버전에서는 정확한 날짜 시간을 사용하고 기본값도 설정할 수 있습니다. 미묘한 비트가 있지만 정밀도 값을 datetime 및 NOW () 함수 호출 모두에 전달해야합니다.

이 예제는 작동합니다 :

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW(6);

이 예제는 작동하지 않습니다 :

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW();

1
`ALTER TABLE  `table_name` CHANGE `column_name` 
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP

업데이트시 타임 스탬프를 업데이트하는 데 사용할 수 있습니다.


1

가장 좋은 방법은 "DEFAULT 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을 사용하여 저에게 효과적이었습니다.

ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();

0
ALTER TABLE table_name
  CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

마침내 이것은 나를 위해 일했습니다!


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

-1

이것이 여전히 활성화되어 있는지 확실하지 않지만 여기에갑니다.

기본값을 Now ()로 설정하는 것과 관련하여 DATETIME 데이터 유형에 대해 가능하지 않습니다. 해당 데이터 유형을 사용하려면 다음과 같이 삽입을 수행 할 날짜를 설정하십시오.

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

내 mySQL 버전은 5.5입니다


7
: 간단하게 할 수INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
user17753

-1

이것은 나를 위해 일했습니다-내 테이블의 INSERT를 UPDATE로 변경했습니다.

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.