Встановити NOW () як значення за замовчуванням для типу даних datetime?


197

У користувачів таблиці є два стовпці, а саме registerDate and lastVisitDateвони складаються з типу даних datetime. Я хотів би зробити наступне.

  1. Встановити значення за замовчуванням registerDate на MySQL NOW ()
  2. Встановіть для параметра LastVisitDate за замовчуванням значення Внутрішнє значення, 0000-00-00 00:00:00яке воно використовує за замовчуванням.

Оскільки таблиця вже існує і має наявні записи, я хотів би використовувати таблицю Modify. Я спробував використати два фрагменти коду нижче, але жоден не працює.

ALTER TABLE users MODIFY registerDate datetime DEFAULT NOW()
ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;

Це дає мені помилку: ERROR 1067 (42000): Invalid default value for 'registerDate'

Чи можливо мені встановити значення Mytime за замовчуванням значення NOW () у MySQL?


4
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP. Ви не визначали data typeполя в обох своїх зусиллях
Шакти Сінгх,

3
Оскільки MySQL 5.6 DATEповинен працювати зі значенням за замовчуваннямNOW()
AbcAeffchen

Відповідно до цієї документації на mysql 5.6: dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html , ви можете використовувати CURRENT_TIMESTAMP () за замовчуванням.
blacktie24

як я
можу

Відповіді:


241

Станом на MySQL 5.6.5, ви можете використовувати DATETIMEтип з динамічним значенням за замовчуванням:

CREATE TABLE foo (
    creation_time      DATETIME DEFAULT   CURRENT_TIMESTAMP,
    modification_time  DATETIME ON UPDATE CURRENT_TIMESTAMP
)

Або навіть комбінувати обидва правила:

modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Довідка:
http://dev.mysql.com/doc/refman/5.7/uk/timestamp-initialization.html
http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available .html

До 5.6.5 потрібно використовувати TIMESTAMPтип даних, який автоматично оновлюється щоразу, коли запис змінюється. На жаль, однак TIMESTAMPу таблиці може існувати лише одне автоматично оновлене поле.

CREATE TABLE mytable (
  mydate TIMESTAMP
)

Дивіться: http://dev.mysql.com/doc/refman/5.1/en/create-table.html

Якщо ви хочете не дозволити MySQL оновлювати значення часової позначки на UPDATE(так що воно лише спрацьовує INSERT), ви можете змінити визначення на:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

80
я дуже не хочу використовувати часову позначку.
Ібрагім Азхар Армар

2
@Ibrahim: мітка часу - ваш єдиний шанс. Якщо ви використовуєте поле для дати, вам потрібно вставити запис, використовуючи now () щоразу.
Нікола Коссу

9
Посібник говорить чітко: "Це означає, наприклад, що ви не можете встановити за замовчуванням для стовпця дати значення такої функції, як NOW () або CURRENT_DATE".
Нікола Коссу

20
@Johan DATETIMEчасто віддають перевагу діапазону, який він може містити: '1000-01-01 00:00:00' до '9999-12-31 23:59:59' порівняно з TIMESTAMPS's' 1970-01-01 00: 00:01 'UTC за' 2038-01-19 03:14:07 'UTC. Наприклад, для зберігання дат народження, або чогось більше 30 років у майбутньому, наприклад.
користувач17753

5
@nickrulez Ви більше не обмежуєтесь timestampтакою поведінкою, як MySQL 5.6
Dan Esparza

70

Я використовую тригер як вирішення для встановлення поля дати NOW () для нових вставок:

CREATE TRIGGER `triggername` BEFORE INSERT ON  `tablename` 
FOR EACH ROW 
SET NEW.datetimefield = NOW()

він також повинен працювати для оновлень

Відповіді Йохана та Леонардо передбачають перехід до поля часової позначки. Хоча це, мабуть, нормально для випадку використання, представленого у запитанні (зберігання RegisterDate та LastVisitDate), це не є універсальним рішенням. Дивіться запитання щодо дати та часу .


4
Це має бути прийнятою відповіддю, але конкретно слід відредагувати її, щоб було очевидно, що це поле для дати. Оригінальний плакат хоче знати, як вирішити його для поля дати, і use a timestampце дурне вирішення, якщо ви дійсно дізнаєтесь про різницю між цими двома типами даних.
phpguru

45

Моє рішення

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;

Ця опція працює, я рекомендую всім користуватися SQLYog або подібним інструментом, що дозволяє робити ці речі в простому інтерфейсі.
Незмінна цегла

27
Це все ще рішення для TIMESTAMPстовпця. Ніхто не просив TIMESTAMP...
Петро Пеллер

2
Так, це не відповідь на запитання. TIMESTAMP - це інший тип поля для DATETIME.
Джон Хант

@Leonardo як я можу відображати лише дату
151291

13

EUREKA !!!


Для всіх тих, хто втратив серце, намагаючись встановити а значення DATETIME замовчуванням у MySQL , я точно знаю, як ви себе почуваєте. Отже ось це:

`ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

Уважно зауважте, що я не додав жодних лапок / подвійних цитат навколо 0 .


Важливе оновлення :

Ця відповідь була розміщена давно. Тоді він працював над моєю (ймовірно, останньою) установкою MySQL, і я відчував, що поділитися ним. Будь ласка, прочитайте коментарі нижче, перш ніж ви вирішите використовувати це рішення зараз.


16
Це залежить від очікувань ... - Це рішення дозволяє мати поле НЕ НУЛЬНЕ, оскільки передбачено за замовчуванням. - Це рішення не встановить поле NOW ().
CodeReaper

10
Це не відповідає на початкове запитання; відповідь повинна чітко сказати.
Метт Браун

2
Майте на увазі, що режим TRADITIONAL SQL включає NO_ZERO_DATE, тому вищевказане в цьому випадку не працюватиме.
Móż

Виходячи з наданих відповідей, це виглядає так, як якщо ви не будете жертвувати DATETIME, щоб бути TIMESTAMP, тоді ви повинні використовувати тригери.
Кріс

1
У цьому рішенні буде певна помилка: "OMG - це дата ZERO! Що за ГЕРЕС! Ми не можемо перетворити" це "на java.lang.Date/System.DateTime! OMG! -Crashes-".
Феліпе


4

У версіях mysql 5.6.5 та новіших версіях ви також можете використовувати точні дати та встановити значення за замовчуванням. Однак є тонкий біт, який повинен передати значення точності як даті, так і виклику функції NOW ().

Цей приклад працює:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW(6);

Цей приклад не працює:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW();

1
`ALTER TABLE  `table_name` CHANGE `column_name` 
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP

Можна використовувати для оновлення часової позначки оновлення.


1

Найкращий спосіб - використовувати "DEFAULT 0". Інший шлях:

    /************ 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();

0

Це працювало для мене, використовуючи MySQL:

ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();

0
ALTER TABLE table_name
  CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Нарешті, це працювало для мене!


0
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `dateCreated` datetime DEFAULT CURRENT_TIMESTAMP,
  `dateUpdated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mobile_UNIQUE` (`mobile`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-1

Не впевнений, чи це все ще активно, але ось що.

Щодо встановлення значень за замовчуванням на Асистент (), я не вважаю, що це можливо для типу даних DATETIME. Якщо ви хочете використовувати цей тип даних, встановіть дату, коли ви будете виконувати вставку так:

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))

Моя версія mySQL - 5.5


7
Можна спростити як:INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
user17753

-1

Це працювало для мене - просто змінив INSERT на UPDATE для мого столу.

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.