source

DEFAULT 절에 CURRENT_TIMESTamp가 있는 TIMESTAMP 열은 왜1개밖에 없어요?

goodcode 2022. 10. 26. 22:29
반응형

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 열이 먼저 와야 합니다.그렇지 않으면 이 스레드에 설명된 오류가 나타납니다.

  1. 열의 데이터 유형을 날짜/시간으로 변경
  2. 트리거 설정

예를 들어 다음과 같습니다.

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_TIMESTAMPDEFAULT또는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_TIMESTAMPDEFAULT또는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

반응형