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
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
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!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)
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.
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
- Zmień typy danych kolumn na datetime
- 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 ;
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.
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;
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;
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
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