DEFAULT 절에 CURRENT_TIMESTamp가 있는 TIMESTAMP 열은 왜1개밖에 없어요?
DEFAULT 또는 ON UPDATE 절에 CURRENT_TIMESTamp가 있는 TIMESTAMP 열은 왜1개밖에 없어요?
CREATE TABLE `foo` (
`ProductID` INT(10) UNSIGNED NOT NULL,
`AddedDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdatedDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=INNODB;
결과적으로 발생하는 오류:
에러 코드: 1293
테이블 정의가 잘못되었습니다. DEFAULT 또는 ON UPDATE 절에 CURRENT_TIMESTamp가 있는 TIMESTAMP 열은 하나만 있을 수 있습니다.
이 제한은 과거의 코드 레거시 이유만으로 인해 MySQL의 최근 버전에서 해제되었습니다.
MySQL 5.6.5의 변경(2012-04-10, 마일스톤8)
이전에는 테이블당 최대 1개의 TIMESTAMP 열을 자동으로 초기화하거나 현재 날짜 및 시간으로 업데이트할 수 있었습니다.이 제한은 해제되었습니다.TIMESTAMP 열 정의에는 DEFAULT CURRENT_TIMESTamp 구와 ON UPDATE CURRENT_TIMESTamp 구를 임의로 조합할 수 있습니다.또한 이러한 구를 DATETIME 열 정의와 함께 사용할 수 있게 되었습니다.자세한 내용은 TIMESTAMP 및 DATETIME에 대한 자동 초기화 및 업데이트를 참조하십시오.
http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-5.html
저도 오래전에 궁금했어요.이력을 조금 검색해 보니, 이 투고는 MySQL(Oracle의 개입 전)의 반공식적인 입장을 나타낸다고 생각합니다.
요컨대:
이 제한은 이 기능이 현재 서버에 실장되어 있는 방법에만 기인하며, 그 이외의 이유는 없습니다.
그래서 그들의 설명은 "이렇게 구현되어 있기 때문"이다.과학적으로 들리진 않는데모든 게 오래된 암호에서 비롯된 것 같아이는 위의 스레드에서 제안됩니다. "첫 번째 타임스탬프 필드만 자동 설정/업데이트되었을 때의 이월"
건배!
이 문제를 피하기 위해 타임스탬프 기본값을 지정할 수 있습니다.
이 투고에서는, 상세한 회피책을 소개합니다.http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/
create table test_table( id integer not null auto_increment primary key, stamp_created timestamp default '0000-00-00 00:00:00', stamp_updated timestamp default now() on update now() );
"insert(삽입)" 중에 두 열에 null을 입력해야 합니다.
mysql> select now() as `before insert`; +---------------------+ | before insert | +---------------------+ | 2022-04-29 18:43:58 | +---------------------+ 1 row in set (0.00 sec) mysql> insert into test_table(stamp_created, stamp_updated) values(null, null); Query OK, 1 row affected (0.00 sec) mysql> select * from test_table; +----+---------------------+---------------------+ | id | stamp_created | stamp_updated | +----+---------------------+---------------------+ | 1 | 2022-04-29 18:43:58 | 2022-04-29 18:43:58 | +----+---------------------+---------------------+ 1 row in set (0.00 sec) mysql> select now() as `before sleep(3)`; +---------------------+ | before sleep(3) | +---------------------+ | 2022-04-29 18:43:58 | +---------------------+ 1 row in set (0.00 sec) mysql> DO SLEEP(3); Query OK, 0 rows affected (3.00 sec) mysql> select now() as `before update`; +---------------------+ | before update | +---------------------+ | 2022-04-29 18:44:01 | +---------------------+ 1 row in set (0.00 sec) mysql> update test_table set id = 2 where id = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from test_table; +----+---------------------+---------------------+ | id | stamp_created | stamp_updated | +----+---------------------+---------------------+ | 2 | 2022-04-29 18:43:58 | 2022-04-29 18:44:01 | +----+---------------------+---------------------+ 1 row in set (0.00 sec)
실제로 구현 오류입니다.
MySQL의 기본 접근 방식은 작성 날짜를 직접 업데이트하고(필요한 경우), MySQL이 타임스탬프를 걱정하도록 하는 것입니다. update date ? update date : creation date다음과 같이 합니다.
CREATE TABLE tracked_data(
`data` TEXT,
`timestamp` TIMESTAMP,
`creation_date` TIMESTAMP
) ENGINE=INNODB;
작성 시 NULL 삽입:
INSERT INTO tracked_data(`data`,`creation_date`) VALUES ('creation..',NULL);
타임스탬프의 NULL 값은 기본적으로 CURRENT_TIMESTamp로 인터퍼레이션됩니다.
MySQL에서 테이블의 첫 번째 TIMESTAMP 열은 둘 다 가져옵니다.DEFAULT CURRENT_TIMESTAMP그리고.ON UPDATE CURRENT_TIMESTAMPAtribute(Atribute가 지정되지 않은 경우)를 지정합니다.이 때문에 Atribute가 포함된 TIMESTAMP 열이 먼저 와야 합니다.그렇지 않으면 이 스레드에 설명된 오류가 나타납니다.
- 열의 데이터 유형을 날짜/시간으로 변경
- 트리거 설정
예를 들어 다음과 같습니다.
DROP TRIGGER IF EXISTS `update_tablename_trigger`;
DELIMITER //
CREATE TRIGGER `update_tablename_trigger` BEFORE UPDATE ON `tablename`
FOR EACH ROW SET NEW.`column_name` = NOW()
//
DELIMITER ;
다양한 답변 조합:
MySQL 5.5에서는DEFAULT CURRENT_TIMESTAMP그리고.ON UPDATE CURRENT_TIMESTAMP에 추가할 수 없다DATETIME단, 에 한해서TIMESTAMP.
규칙:
1) 최대 1개TIMESTAMP테이블당 컬럼을 자동으로 초기화하거나 현재 날짜 및 시간으로 업데이트할 수 있습니다.(MySQL Docs).
그래서 하나밖에 없다TIMESTAMP가질 수 있다CURRENT_TIMESTAMP에DEFAULT또는ON UPDATE조문
2) 첫 번째NOT NULL TIMESTAMP명시하지 않은 열DEFAULT와 같은 가치관을 가지다created_date timestamp default '0000-00-00 00:00:00'암묵적으로 주어질 것이다DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP그 후TIMESTAMP열을 지정할 수 없습니다.CURRENT_TIMESTAMP에DEFAULT또는ON UPDATE조문
CREATE TABLE `address` (
`id` int(9) NOT NULL AUTO_INCREMENT,
`village` int(11) DEFAULT NULL,
`created_date` timestamp default '0000-00-00 00:00:00',
-- Since explicit DEFAULT value that is not CURRENT_TIMESTAMP is assigned for a NOT NULL column,
-- implicit DEFAULT CURRENT_TIMESTAMP is avoided.
-- So it allows us to set ON UPDATE CURRENT_TIMESTAMP on 'updated_date' column.
-- How does setting DEFAULT to '0000-00-00 00:00:00' instead of CURRENT_TIMESTAMP help?
-- It is just a temporary value.
-- On INSERT of explicit NULL into the column inserts current timestamp.
-- `created_date` timestamp not null default '0000-00-00 00:00:00', // same as above
-- `created_date` timestamp null default '0000-00-00 00:00:00',
-- inserting 'null' explicitly in INSERT statement inserts null (Ignoring the column inserts the default value)!
-- Remember we need current timestamp on insert of 'null'. So this won't work.
-- `created_date` timestamp null , // always inserts null. Equally useless as above.
-- `created_date` timestamp default 0, // alternative to '0000-00-00 00:00:00'
-- `created_date` timestamp,
-- first 'not null' timestamp column without 'default' value.
-- So implicitly adds DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP.
-- Hence cannot add 'ON UPDATE CURRENT_TIMESTAMP' on 'updated_date' column.
`updated_date` timestamp null on update current_timestamp,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=132 DEFAULT CHARSET=utf8;
INSERT INTO address (village,created_date) VALUES (100,null);
mysql> select * from address;
+-----+---------+---------------------+--------------+
| id | village | created_date | updated_date |
+-----+---------+---------------------+--------------+
| 132 | 100 | 2017-02-18 04:04:00 | NULL |
+-----+---------+---------------------+--------------+
1 row in set (0.00 sec)
UPDATE address SET village=101 WHERE village=100;
mysql> select * from address;
+-----+---------+---------------------+---------------------+
| id | village | created_date | updated_date |
+-----+---------+---------------------+---------------------+
| 132 | 101 | 2017-02-18 04:04:00 | 2017-02-18 04:06:14 |
+-----+---------+---------------------+---------------------+
1 row in set (0.00 sec)
기타 옵션(단,updated_date첫 번째 열입니다).
CREATE TABLE `address` (
`id` int(9) NOT NULL AUTO_INCREMENT,
`village` int(11) DEFAULT NULL,
`updated_date` timestamp null on update current_timestamp,
`created_date` timestamp not null ,
-- implicit default is '0000-00-00 00:00:00' from 2nd timestamp onwards
-- `created_date` timestamp not null default '0000-00-00 00:00:00'
-- `created_date` timestamp
-- `created_date` timestamp default '0000-00-00 00:00:00'
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=132 DEFAULT CHARSET=utf8;
수정은 [UpdateedDate]필드에 붙이고 [AddedDate]필드가 [UpdateDate]값이 눌인 경우에만 [UpdateDate]필드를 갱신하는 트리거가 되는 경우가 있습니다.
이것을 시험해 보세요.
CREATE TABLE `test_table` (
`id` INT( 10 ) NOT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT 0,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE = INNODB;
이것이 MYSQL 5.5 버전에서의 제한 사항입니다.버전을 5.6으로 업데이트해야 합니다.
Error
MYSQL에서 테이블을 추가할 때 이 오류가 발생했습니다.
테이블 정의가 잘못되었습니다. DEFAULT 또는 ON UPDATE 절 My new MYSQL에 CURRENT_TIMESTamp가 포함된 TIMESTAMP 열은 하나만 있을 수 있습니다.
테이블은 이렇게 생겼어요.
create table_name(col1 int(5) auto_int 프라이머리 키, col2 varchar(300), col3 varchar(500), col4 int(3), col5 tinyint(2), col6 timestamp default current_int on update current_inate current_int, col8 times, col8 timpa(0), col9 timestamp default 1).
다른 MYSQL 버전 및 일부 구글링의 변경에 대해 잠시 읽은 후MYSQL 버전 5.6에서 버전 5.5에서 변경된 사항이 있음을 알게 되었습니다.
이 문서는 문제 해결에 도움이 됩니다.http://www.oyewiki.com/MYSQL/Incorrect-table-definition-there-can-be-only-one-timestamp-column
언급URL : https://stackoverflow.com/questions/4489548/why-there-can-be-only-one-timestamp-column-with-current-timestamp-in-default-cla
'source' 카테고리의 다른 글
| MySQL 데이터베이스 포함 Python 3.4.0 (0) | 2022.11.05 |
|---|---|
| date_modify를 DateTime 객체로 사용하여 php에서 현재 달의 첫 번째 날 (0) | 2022.11.05 |
| 블레이드 템플릿 뷰를 원시 HTML 문자열로 가져오는 방법 (0) | 2022.10.26 |
| JavaScript에서 소수점 두 개로 숫자 형식 지정 (0) | 2022.10.26 |
| 클래스 경로의 Java 패키지에서 모든 클래스를 읽으려면 어떻게 해야 합니까? (0) | 2022.10.26 |