Як встановити значення за замовчуванням для стовпця MySQL Datetime?
У SQL Server - це getdate()
. Що таке еквівалент для MySQL? Я використовую MySQL 5.x, якщо це фактор.
Як встановити значення за замовчуванням для стовпця MySQL Datetime?
У SQL Server - це getdate()
. Що таке еквівалент для MySQL? Я використовую MySQL 5.x, якщо це фактор.
Відповіді:
ВАЖЛИВО ЗМІСТ. Тепер цього можна досягти за допомогою полів DATETIME з моменту MySQL 5.6.5 , дивіться інший пост нижче ...
Попередні версії не можуть це зробити з DATETIME ...
Але ви можете це зробити за допомогою TIMESTAMP:
mysql> create table test (str varchar(32), ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)
mysql> desc test;
+-------+-------------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+-------------------+-------+
| str | varchar(32) | YES | | NULL | |
| ts | timestamp | NO | | CURRENT_TIMESTAMP | |
+-------+-------------+------+-----+-------------------+-------+
2 rows in set (0.00 sec)
mysql> insert into test (str) values ("demo");
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+------+---------------------+
| str | ts |
+------+---------------------+
| demo | 2008-10-03 22:59:52 |
+------+---------------------+
1 row in set (0.00 sec)
mysql>
** CAVEAT: Якщо ви визначите стовпець із CURRENT_TIMESTAMP ON як стандартний, вам потрібно ВЖЕ ВЗАЄМО вказати значення для цього стовпця, або значення автоматично відновиться до "now ()" при оновленні. Це означає, що якщо ви не хочете, щоб значення змінювалося, ваш запис UPDATE повинен містити "[назва вашого стовпця] = [назва вашого стовпця]" (або якесь інше значення) або значення стане "зараз ()". Дивно, але правда. Я сподіваюся, що це допомагає. Я використовую 5.5.56-MariaDB **
DATE
стовпця за замовчуванням ? (не datetime
стовпець).
У версії 5.6.5 можна встановити значення за замовчуванням у стовпці з датою та навіть зробити стовпець, який оновлюватиметься після оновлення рядка. Визначення типу:
CREATE TABLE foo (
`creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP
)
Довідка: http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
MySQL ( до версії 5.6.5 ) не дозволяє використовувати функції для значень DateTime за замовчуванням. TIMESTAMP не підходить через його дивну поведінку і не рекомендується використовувати як вихідні дані. (Див. Значення за замовчуванням типу даних MySQL .)
Однак це можна зробити , створивши тригер .
У мене є таблиця з полем DateCreate типу DateTime. Я створив на цій таблиці тригер "Перед вставкою" та " SET NEW.DateCreated=NOW()
", і він чудово працює.
Я сподіваюся, що це комусь допоможе.
IF NEW.created_at IS NOT NULL
Для мене тригерний підхід працював найкраще, але я знайшов корч із підходом. Розглянемо основний тригер, щоб встановити поле дати на поточний час на вставці:
CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
FOR EACH ROW SET NEW.dateAdded = NOW();
Зазвичай це чудово, але скажіть, що ви хочете встановити поле вручну за допомогою оператора INSERT, наприклад:
INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');
Що відбувається, що тригер негайно замінює надане вами значення для поля, і тому єдиний спосіб встановити непоточний час - це наступний оператор UPDATE - yuck! Щоб замінити цю поведінку, коли надається значення, спробуйте цей трохи змінений тригер з оператором IFNULL:
CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());
Це дає найкраще для обох світів: ви можете вказати значення для стовпця дати та воно займе, інакше воно буде за замовчуванням для поточного часу. Це все ще гетто відносно чогось чистого, як DEFAULT GETDATE () у визначенні таблиці, але ми все ближче!
NULL
. Більше жодних попереджень.
dateAdded
заголовок покаже всі "0000-00-00 00:00:00". Використовуючи це, виходить хитрість: `FOR EACH ROW IF NEW.dateAdded = 0 THEN SET NEW.dateAdded = NOW (); КОНЕЦЬ, АКО; `
Мені вдалося вирішити це за допомогою цього оператора alter на моєму столі, який мав два поля datetime.
ALTER TABLE `test_table`
CHANGE COLUMN `created_dt` `created_dt` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
CHANGE COLUMN `updated_dt` `updated_dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
Це працює так, як ви б очікували, що функція now () працює. Вставлення нулів або ігнорування полів create_dt та updated_dt призводить до ідеального значення часової позначки в обох полях. Будь-яке оновлення рядка змінює оновлений_dt. Якщо ви вставляєте записи через браузер запитів MySQL, вам знадобився ще один крок, тригер для обробки create_dt з новою міткою часу.
CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
FOR EACH ROW SET NEW.created_dt = NOW();
Тригером може бути все, що ви хочете. Мені подобається умова іменування [trig] _ [my_table_name] _ [insert]
Ви можете використовувати тригери для цього типу матеріалів.
CREATE TABLE `MyTable` (
`MyTable_ID` int UNSIGNED NOT NULL AUTO_INCREMENT ,
`MyData` varchar(10) NOT NULL ,
`CreationDate` datetime NULL ,
`UpdateDate` datetime NULL ,
PRIMARY KEY (`MyTable_ID`)
)
;
CREATE TRIGGER `MyTable_INSERT` BEFORE INSERT ON `MyTable`
FOR EACH ROW BEGIN
-- Set the creation date
SET new.CreationDate = now();
-- Set the udpate date
Set new.UpdateDate = now();
END;
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
-- Set the udpate date
Set new.UpdateDate = now();
END;
Для всіх тих, хто втратив серце, намагаючись встановити значення DATETIME за замовчуванням у MySQL , я точно знаю, як ви себе почуваєте / відчуваєте. Отже ось таке:
ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
Уважно зауважте, що я не додав жодних лапок / подвійних лапок навколо 0
Я буквально стрибаю після вирішення цього: D
ALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;
MySQL 5.6 виправив цю проблему .
ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
Якщо ви вже створили таблицю, то можете використовувати
Щоб змінити значення за замовчуванням на поточний час дати
ALTER TABLE <TABLE_NAME>
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
Щоб змінити значення за замовчуванням на "2015-05-11 13:01:01"
ALTER TABLE <TABLE_NAME>
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT '2015-05-11 13:01:01';
це справді жахлива новина. ось для цього тривалий запит на помилку / функцію . ця дискусія також говорить про обмеження типу даних часових позначок.
Мені серйозно цікаво, в чому полягає проблема із реалізацією цієї речі.
Я запускаю MySql Server 5.7.11 і це речення:
ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
це НЕ працює. Але наступне:
ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
просто працює .
Як замітка на полях , він згадується в MySQL документації :
Тип DATE використовується для значень з частиною дати, але не має часової частини. MySQL отримує та відображає значення DATE у форматі "РРРР-MM-DD". Підтримується діапазон від "1000-01-01" до "9999-12-31".
навіть якщо вони також кажуть:
Недійсні значення DATE, DATETIME або TIMESTAMP перетворюються на значення "нуль" відповідного типу ("0000-00-00" або "0000-00-00 00:00:00").
Ви можете використовувати now () для встановлення значення стовпця datetime, але майте на увазі, що ви не можете використовувати це як значення за замовчуванням.
NOW()
та використовуйте його пізніше для вставки. Для версії 5.6 просто встановіть NOW()
як значення за замовчуванням.
Для всіх, хто використовує стовпчик TIMESTAMP як рішення, я хочу використати таке обмеження з посібника:
http://dev.mysql.com/doc/refman/5.0/en/datetime.html
"Тип даних TIMESTAMP має діапазон від '1970-01-01 00:00:01' UTC до ' 2038-01-19 03:14:07 ' UTC. Він має різні властивості, залежно від версії MySQL та SQL режим роботи сервера. Ці властивості описані далі в цьому розділі. "
Таким чином, це очевидно зламає ваше програмне забезпечення приблизно через 28 років.
Я вважаю, що єдиним рішенням на базі даних є використання тригерів, як зазначено в інших відповідях.
При визначенні багаторядкових тригерів потрібно змінити роздільник, оскільки компілятор MySQL буде сприймати крапку з комою як кінець тригера та генерує помилку. напр
DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
-- Set the udpate date
Set new.UpdateDate = now();
END//
DELIMITER ;
Ось як це зробити на MySQL 5.1:
ALTER TABLE `table_name` CHANGE `column_name` `column_name`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
Я не маю поняття, чому вам потрібно вводити назву стовпця двічі.
Хоча ви не можете зробити це DATETIME
за визначенням за замовчуванням, ви можете просто включити оператор select у свій оператор вставлення таким чином:
INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
Зверніть увагу на відсутність цитат навколо столу.
Для MySQL 5.5
Якщо ви намагаєтесь встановити значення за замовчуванням як NOW (), я не думаю, що MySQL це підтримує. У MySQL ви не можете використовувати функцію або вираз у якості значення за замовчуванням для будь-якого типу стовпців, за винятком стовпця типу TIMESTAMP типу, для якого ви можете вказати CURRENT_TIMESTAMP як за замовчуванням.
Я думаю, що в mysql це просто, оскільки в mysql вбудована функція, яка називається now (), яка дає поточний час (час цієї вставки).
Отже, ваш запит повинен виглядати приблизно так
CREATE TABLE defaultforTime(
`creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`modification_time` DATETIME default now()
);
Дякую.
CREATE TABLE `testtable` (
`id` INT(10) NULL DEFAULT NULL,
`colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12'
)
У наведеному вище запиті для створення 'testtable' я використав '1999-12-12 12:12:12' як значення за замовчуванням для стовпця DATETIME colname
Використовуйте наступний код
DELIMITER $$
CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
BEGIN
SET new.datefield = NOW();
END $$
DELIMITER ;
Якщо ви намагаєтесь встановити значення за замовчуванням як NOW (), MySQL підтримує, що вам потрібно змінити тип стовпця TIMESTAMP замість DATETIME. TIMESTAMP за замовчуванням мають поточну дату та час. Я думаю, це вирішить вашу проблему.
Візьмемо для прикладу Якщо б у мене була таблиця з назвою "site" із створеним_at та стовпцем update_at, які були і DATETIME, і потрібне значення за замовчуванням зараз, я міг би виконати наступний sql, щоб досягти цього.
ALTER TABLE `site` CHANGE` created_at` `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; ALTER TABLE `сайт` ЗМІНА` created_at` `created_at` DATETIME NULL DEFAULT NULL; ALTER TABLE `site` CHANGE` updated_at` `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; ALTER TABLE `site` CHANGE` updated_at` `updated_at` DATETIME NULL DEFAULT NULL;
Послідовність висловлювань важлива, оскільки в таблиці не може бути двох стовпців типу TIMESTAMP із значеннями за замовчуванням CUREENT TIMESTAMP
Це мій приклад запуску:
/************ 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();
Відмінно працює з MySQL 8.x
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;
Ви можете вирішити часову позначку за замовчуванням. Спочатку розгляньте, який набір символів ви використовуєте, наприклад, якщо u взяли utf8, цей набір символів підтримує всі мови, а якщо у вас прийнято laten1, цей набір символів підтримує лише англійську мову. Наступна установка, якщо ви працюєте в будь-якому проекті, ви повинні знати часовий пояс клієнта і вибрати, що ви - клієнтська зона. Цей крок є обов’язковим.