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

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를 사용하고 있습니다 **


답변

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


답변

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

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

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

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


답변

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

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


답변

두 개의 날짜 시간 필드가있는 테이블 에서이 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