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
