Dlaczego w klauzuli domyślnej może być tylko jedna kolumna znacznika czasu z bieżącym znacznikiem czasu?

Dlaczego może być tylko jedna kolumna znacznika czasu z CURRENT_TIMESTAMP w klauzuli DEFAULT lub ON UPDATE?

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;

Błąd, który powoduje:

Kod Błędu: 1293

Nieprawidłowa definicja tabeli; można być tylko jedną kolumną znacznika czasu z CURRENT_TIMESTAMP w DEFAULT lub ON Klauzula aktualizacji

Author: OMG Ponies, 2010-12-20

9 answers

To ograniczenie, które było spowodowane tylko historycznymi, dziedziczącymi kodami, zostało zniesione w ostatnich wersjach MySQL:

Zmiany w MySQL 5.6.5 (2012-04-10, Milestone 8)

Poprzednio, co najwyżej jedna kolumna znacznika czasu w tabeli mogła być automatycznie inicjowane lub aktualizowane do bieżącej daty i godziny. Ograniczenie to zostało zniesione. Dowolna definicja kolumny TIMESTAMP może mieć dowolną kombinację domyślnego CURRENT_TIMESTAMP i ON UPDATE CURRENT_TIMESTAMP klauzule. Ponadto klauzule te mogą być teraz stosowane z definicjami kolumn DATETIME. Aby uzyskać więcej informacji, zobacz Automatyczny Inicjalizacja i aktualizacja dla znacznika czasu i DATETIME.

Http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-5.html

 175
Author: augustin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-06 08:23:58

Też się zastanawiałem, że dawno temu. Szukałam trochę w historii i myślę, że ten post: http://lists.mysql.com/internals/34919 reprezentuje pół-oficjalne stanowisko MySQL (przed interwencją Oracle;))

W skrócie:

Ograniczenie to wynika jedynie z sposób, w jaki ta funkcja jest obecnie zaimplementowane na serwerze i tam nie ma innych powodów dla jego istnienie.

Więc ich wyjaśnienie jest "ponieważ jest realizowane w ten sposób". To nie brzmi zbyt naukowo. Myślę, że to wszystko pochodzi ze starego kodu. Jest to sugerowane w powyższym wątku: "przeniesienie z momentu, gdy tylko pierwsze pole znacznika czasu zostało automatycznie ustawione / zaktualizowane".

Zdrówko!
 40
Author: Lachezar Balev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-20 13:28:59

Możemy podać domyślną wartość znacznika czasu, aby uniknąć tego problemu.

Ten post daje szczegółowe obejście: 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() 
);

Zauważ, że konieczne jest wprowadzenie NULL do obu kolumn podczas "insert":

mysql> insert into test_table(stamp_created, stamp_updated) values(null, null); 
Query OK, 1 row affected (0.06 sec)
mysql> select * from t5; 
+----+---------------------+---------------------+ 
| id | stamp_created       | stamp_updated       |
+----+---------------------+---------------------+
|  2 | 2009-04-30 09:44:35 | 2009-04-30 09:44:35 |
+----+---------------------+---------------------+
2 rows in set (0.00 sec)  
mysql> update test_table set id = 3 where id = 2; 
Query OK, 1 row affected (0.05 sec) Rows matched: 1  Changed: 1  Warnings: 0  
mysql> select * from test_table;
+----+---------------------+---------------------+
| id | stamp_created       | stamp_updated       | 
+----+---------------------+---------------------+ 
|  3 | 2009-04-30 09:44:35 | 2009-04-30 09:46:59 | 
+----+---------------------+---------------------+ 
2 rows in set (0.00 sec) 
 38
Author: Scarlett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-20 17:07:09

Rzeczywiście błąd implementacji.

Natywne podejście w MySQL polega na samodzielnej aktualizacji daty utworzenia (jeśli jest taka potrzeba) i zmartwieniu MySQL o znacznik czasu update date ? update date : creation date Tak:

CREATE TABLE tracked_data( 
  `data` TEXT,
  `timestamp`   TIMESTAMP,
  `creation_date` TIMESTAMP                                   
) ENGINE=INNODB; 

Przy tworzeniu wstawka NULL:

INSERT INTO tracked_data(`data`,`creation_date`) VALUES ('creation..',NULL);

Wartości NULL dla znacznika czasu są domyślnie interpertowane jako CURRENT_TIMESTAMP.

W MySQL Pierwsza kolumna TIMESTAMP tabeli otrzymuje atrybut DEFAULT CURRENT_TIMESTAMP i ON UPDATE CURRENT_TIMESTAMP, Jeśli nie podano dla niej żadnych atrybutów. dlatego TIMESTAMP kolumna z atrybutami musi być pierwsza, w przeciwnym razie pojawi się błąd opisany w tym wątku.

 16
Author: mooli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-12 00:16:21
  1. Zmień typy danych kolumn na datetime
  2. Set trigger

Takie jak:

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 ;
 14
Author: Feng-Chun Ting,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-20 17:07:29

Dobrze poprawką może być umieszczenie go w polu UpdatedDate i mieć wyzwalacz, który aktualizuje pole AddedDate z wartością UpdatedDate tylko wtedy, gdy AddedDate jest null.

 1
Author: HLGEM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-20 17:07:36

Łączenie różnych odpowiedzi:

W MySQL 5.5, DEFAULT CURRENT_TIMESTAMP i ON UPDATE CURRENT_TIMESTAMP nie mogą być dodawane na DATETIME, ale tylko na TIMESTAMP.

Zasady:

1) co najwyżej jedna kolumna TIMESTAMP w tabeli może być automatycznie (lub ręcznie[moje dodanie]) zainicjowana lub zaktualizowana do bieżącej daty i godziny. (Dokumenty MySQL).

Więc tylko jedna TIMESTAMP może mieć CURRENT_TIMESTAMP w DEFAULT lub ON UPDATE} klauzula

2) PierwszyNOT NULL TIMESTAMP kolumna bez wyrazu DEFAULT wartość created_date timestamp default '0000-00-00 00:00:00' będzie domyślnie podana DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP i dlatego kolejne kolumny TIMESTAMP nie mogą być podane CURRENT_TIMESTAMP na DEFAULT lub ON UPDATE klauzuli

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)

Inna opcja (ale updated_date jest pierwszą kolumną):

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;
 1
Author: user104309,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-17 22:44:38

Spróbuj tego:

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;
 0
Author: Shoaib Qureshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-30 11:23:15

Jest to ograniczenie w wersji MYSQL 5.5. Musisz zaktualizować wersję do 5.6.

Error

Miałem ten błąd przy dodawaniu tabeli w MYSQL

Nieprawidłowa definicja tabeli; może być tylko jedna kolumna znacznika czasu z CURRENT_TIMESTAMP w domyślnej lub w klauzuli aktualizacji mój nowy MYSQL

Stół wygląda mniej więcej tak.

Create table table_name (col1 int(5) AUTO_INCREMENT klucz podstawowy, col2 varchar (300), col3 varchar (500), col4 int (3), col5 tinyint (2), col6 timestamp default current_timestamp, col7 timestamp default current_timestamp on update current_timestamp, col8 tinyint(1) default 0, col9 tinyint (1) default 1);

Po pewnym czasie czytania o zmianach w różnych wersjach MYSQL i niektórych googlowania. Dowiedziałem się, że wprowadzono pewne zmiany w MYSQL w wersji 5.6 w stosunku do wersji 5.5.

Ten artykuł pomoże Ci rozwiązać problem. http://www.oyewiki.com/MYSQL/Incorrect-table-definition-there-can-be-only-one-timestamp-column

 0
Author: Ankur Rastogi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-31 20:08:42