MySQL Datetime 열의 기본값을 어떻게 설정합니까?
SQL Server에서getdate()
. MySQL에 상응하는 것은 무엇입니까? MySQL 5.x를 사용하고 있습니다.
중요한 편집 :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를 사용하고있다 **
DATE
기둥? (datetime
기둥). - Sajib Acharya
버전 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
date
- Nick
MySQL (버전 5.6.5 이전) 함수는 기본 DateTime 값에 사용할 수 없습니다. TIMESTAMP는 비정상적인 작동으로 인해 적합하지 않으며 입력 데이터로 사용하기 위해 권장되지 않습니다. (만나다MySQL 데이터 유형 기본값.)
즉, 이렇게 할 수 있습니다.트리거 생성.
DateTime 형식의 DateCreated 필드가있는 테이블이 있습니다. 나는 그 테이블에 "Before Insert"와 "SET NEW.DateCreated=NOW()
"잘 작동합니다.
나는 이것이 누군가를 돕기를 바랍니다.
IF NEW.created_at IS NOT NULL
- Petr Peller
나를 위해 방아쇠 접근 방식이 최선을 다했지만 접근법에 걸림돌을 발견했습니다. 삽입 할 때 날짜 필드를 현재 시간으로 설정하는 기본 트리거를 고려하십시오.
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 ()처럼 깨끗한 것과 관련하여 여전히 빈민굴이지만, 점점 더 가까워지고 있습니다!
NULL
. 더 이상 경고가 없습니다. - KajidateAdded
모든 0000-00-00 00 : 00 : 00 & # 39;이 (가) 표시됩니다. 이것을 사용하면 다음과 같은 트릭을 수행하게됩니다 :`FOR EACH ROW IF NEW.dateAdded = 0 THEN SET NEW.dateAdded = NOW (); END IF; - Kenney
두 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]
트리거를 사용하여 이러한 유형의 작업을 수행 할 수 있습니다.
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, 나는 네가 어떻게 느끼고 / 느꼈는지 정확하게 안다. 그래서 여기 있습니다 :
ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
조심스럽게 관찰하십시오.작은 따옴표 / 큰 따옴표를 추가하지 않았습니다.주위의
나는이 문제를 해결 한 후 문자 그대로 뛰어 오르고있다 : D
ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
이것은 참으로 끔찍한 소식입니다.여기에 오랫동안 대기중인 버그 / 기능 요청이 있습니다.. 이 토론에서는 타임 스탬프 데이터 유형의 한계에 대해서도 설명합니다.
나는 심각 하게이 일을 구현 점점 문제가 궁금 해서요.
이미 테이블을 만든 경우에는 다음을 사용할 수 있습니다.
기본값을 현재 날짜 시간으로 변경하려면
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';
솔루션으로 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 년 동안 귀하의 소프트웨어를 분명히 망칠 것입니다.
데이터베이스 측의 유일한 해결책은 다른 답변에서 언급 한 트리거를 사용하는 것입니다.
멀티 라인 트리거를 정의하는 동안 세마 콜론 (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 ;
now ()를 사용하여 datetime 열의 값을 설정할 수 있지만 기본값으로 사용할 수는 없습니다.
NOW()
삽입을 위해 나중에 사용하십시오. 버전 5.6의 경우 간단히 설정합니다.NOW()
기본값으로 사용합니다. - Abel Callejo
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"값으로 변환됩니다.
네가 할 수는 없지만DATETIME
기본 정의에서 select 문을 insert 문에 다음과 같이 간단하게 통합 할 수 있습니다.
INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
테이블 주위에 따옴표가 없음을 유의하십시오.
MySQL 5.5의 경우
MySQL 5.1에서이 작업을 수행하는 방법은 다음과 같습니다.
ALTER TABLE `table_name` CHANGE `column_name` `column_name`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
열 이름을 두 번 입력해야하는 이유가 없습니다.
NOW ()로 디폴트 값을 설정하려고한다면, MySQL이 이것을 지원한다고 생각하지 않습니다. MySQL에서는 CURRENT_TIMESTAMP를 기본값으로 지정할 수있는 TIMESTAMP 데이터 유형 열을 제외하고 모든 유형의 열에 대해 함수 또는 표현식을 기본값으로 사용할 수 없습니다.
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
다음 코드를 사용하십시오.
DELIMITER $$
CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
BEGIN
SET new.datefield = NOW();
END $$
DELIMITER ;
mysql inbuilt 함수는 현재 시간 (삽입 시간)을 알려주는 now ()를 호출하기 때문에 mysql에서 간단하다고 생각한다.
따라서 검색어는 유사하게 보입니다.
CREATE TABLE defaultforTime(
`creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`modification_time` DATETIME default now()
);
고맙습니다.
디폴트 값을 NOW ()로 설정하려고한다면, MySQL은 DATETIME 대신에 TIMESTAMP 컬럼의 타입을 변경해야한다는 것을 지원한다. TIMESTAMP는 현재 날짜와 시간이 기본값으로 설정되어 있습니다. 문제가 해결 될 것이라고 생각합니다.
예를 들어, 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 임).
이것은 내 방아쇠 예제입니다.
/************ 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();
기본 시간 소인을 해결할 수 있습니다. 먼저 어떤 문자 집합을 사용하는지 고려해보십시오. 예를 들어 U를 취한 경우이 문자 집합은 모든 언어를 지원하고 u는 laten1을 취하면이 문자 집합은 영어 만 지원합니다. 다음 프로젝트라면 클라이언트 시간대를 알아야하고 클라이언트 영역을 선택해야합니다. 이 단계는 필수 항목입니다.