MySQL දිවා කාල තීරුව සඳහා පෙරනිමි අගයක් ඔබ සකසන්නේ කෙසේද?
SQL සේවාදායකයේ එය එයයි getdate()
. MySQL සඳහා සමාන වන්නේ කුමක්ද? එය සාධකයක් නම් මම MySQL 5.x භාවිතා කරමි.
MySQL දිවා කාල තීරුව සඳහා පෙරනිමි අගයක් ඔබ සකසන්නේ කෙසේද?
SQL සේවාදායකයේ එය එයයි getdate()
. MySQL සඳහා සමාන වන්නේ කුමක්ද? එය සාධකයක් නම් මම MySQL 5.x භාවිතා කරමි.
Answers:
වැදගත් සංස්කරණය: MySQL 5.6.5 සිට DATETIME ක්ෂේත්ර සමඟ මෙය සාක්ෂාත් කරගත හැකිය , පහත දැක්වෙන අනෙක් ලිපිය දෙස බලන්න ...
පෙර අනුවාදයන්ට 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 සමඟ තීරුවක් පෙරනිමියෙන් අර්ථ දක්වන්නේ නම්, ඔබට මෙම තීරුව සඳහා සෑම විටම අගයක් නියම කිරීමට අවශ්ය වනු ඇත, නැතහොත් යාවත්කාලීනයේ අගය ස්වයංක්රීයව "දැන් ()" වෙත යලි සකසනු ඇත. මෙයින් අදහස් කරන්නේ ඔබට අගය වෙනස් වීමට අවශ්ය නැතිනම්, ඔබගේ යාවත්කාලීන කිරීමේ ප්රකාශයේ "[ඔබේ තීරුවේ නම] = [ඔබේ තීරුවේ නම]" (හෝ වෙනත් වටිනාකමක්) අඩංගු විය යුතු අතර වටිනාකම "දැන් ()" බවට පත්වනු ඇත. අමුතු, නමුත් ඇත්ත. මම හිතනවා මේක උදව් වෙයි කියලා. මම භාවිතා කරන්නේ 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 අනුවාදයට පෙර ) පෙරනිමි දිනය ටයිම් අගයන් සඳහා කාර්යයන් භාවිතා කිරීමට ඉඩ නොදේ. TIMESTAMP එහි අමුතු හැසිරීම නිසා සුදුසු නොවන අතර ආදාන දත්ත ලෙස භාවිතා කිරීම නිර්දේශ නොකරයි. ( MySQL දත්ත වර්ග පෙරනිමි බලන්න .)
ප්රේරකයක් නිර්මාණය කිරීමෙන් ඔබට මෙය කළ හැකිය .
ඩේට් ටයිම් වර්ගයේ ඩේට්ක්රියේටඩ් ක්ෂේත්රයක් සහිත වගුවක් මා සතුව ඇත. මම එම වගුවේ "ඇතුල් කිරීමට පෙර" සහ " 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');
සිදුවන්නේ, ප්රේරකය ඔබ විසින් ක්ෂේත්රය සඳහා ලබා දී ඇති අගය වහාම නැවත ලියයි, එබැවින් වත්මන් නොවන වේලාවක් සැකසීමට ඇති එකම ක්රමය පසු විපරම් යාවත්කාලීන ප්රකාශයකි - යක්! අගයක් ලබා දුන් විට මෙම හැසිරීම අභිබවා යාමට, 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' පෙන්වනු ඇත. මෙය භාවිතා කිරීම උපක්රමය කරයි: `සෑම පේළියකටම NEW.dateAdded = 0 පසුව අළුත් කරන්න.ඩේට් එකතු කරන්න = දැන් (); END IF; `
දිවා කාලයේ ක්ෂේත්ර දෙකක් ඇති මගේ වගුවේ මෙම වෙනස් කිරීමේ ප්රකාශය භාවිතයෙන් මෙය විසඳීමට මට හැකි විය.
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;
මෙය ක්රියාත්මක වන්නේ ඔබ දැන් () ශ්රිතය ක්රියාත්මක කරනු ඇතැයි අපේක්ෂා කරන ආකාරයට ය. ශුන්ය ඇතුල් කිරීම හෝ නිර්මාණය කළ_ඩී සහ යාවත්කාලීන කළ ක්ෂේත්ර නොසලකා හැරීම මඟින් ක්ෂේත්ර දෙකෙහිම පරිපූර්ණ කාලරාමු අගයක් ලැබේ. පේළියට කරන ඕනෑම යාවත්කාලීනයක් යාවත්කාලීන_ඩී වෙනස් කරයි. ඔබ MySQL විමසුම් බ්රව්සරය හරහා වාර්තා ඇතුළු කරන්නේ නම්, ඔබට තවත් එක් පියවරක් අවශ්ය විය, නව කාලරාමුවකින් create_dt හැසිරවීමට ප්රේරකයක්.
CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
FOR EACH ROW SET NEW.created_dt = NOW();
ප්රේරකය ඔබට අවශ්ය ඕනෑම දෙයක් විය හැකිය මම නම් කිරීමේ සම්මුතියට කැමතියි [ප්රේරකය] _ [my_table_name] _ [ඇතුළු කරන්න]
මේ ආකාරයේ දේවල් කිරීමට ඔබට ප්රේරක භාවිතා කළ හැකිය.
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;
MySQL හි සුපුරුදු DATETIME අගයක් සැකසීමට උත්සාහ කරන හදවත අහිමි වූ සියලු දෙනා සඳහා , ඔබට දැනෙන / දැනෙන ආකාරය මම හරියටම දනිමි. ඉතින් මෙන්න:
ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
මම 0 වටා තනි උපුටා දැක්වීම් / ද්විත්ව උපුටා දැක්වීම් එකතු කර නොමැති බව ප්රවේශමෙන් නිරීක්ෂණය කරන්න
මෙය විසඳීමෙන් පසු මම වචනාර්ථයෙන් පනින්නෙමි: ඩී
ALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;
MySQL 5.6 මෙම ගැටලුව නියම කර තිබේ .
ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
මෙය ඇත්තෙන්ම භයානක ආරංචියකි. මෙන්න මේ සඳහා දීර් pe කාලයක් තිස්සේ පවතින දෝෂ / විශේෂාංග ඉල්ලීමක් . එම සාකච්ඡාව කාලරාමු දත්ත වර්ගයේ සීමාවන් ගැන ද කතා කරයි.
මෙම කාරණය ක්රියාවට නැංවීමේ ගැටලුව කුමක්දැයි මම බරපතල ලෙස කල්පනා කරමි.
ඔබ දැනටමත් වගුව නිර්මාණය කර ඇත්නම් ඔබට භාවිතා කළ හැකිය
පෙරනිමි අගය වත්මන් දිනය වේලාවට වෙනස් කිරීම
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';
දිවා කාල තීරුවක අගය සැකසීමට ඔබට දැන් () භාවිතා කළ හැකිය, නමුත් ඔබට එය පෙරනිමි අගයක් ලෙස භාවිතා කළ නොහැකි බව මතක තබා ගන්න.
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 සේවාදායකය 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 අගයන් 'YYYY-MM-DD' ආකෘතියෙන් ලබා ගනී. සහාය දක්වන පරාසය '1000-01-01' සිට '9999-12-31' වේ.
ඔවුන් මෙසේ පැවසුවද:
අවලංගු DATE, DATETIME, හෝ TIMESTAMP අගයන් සුදුසු වර්ගයේ ('0000-00-00' හෝ '0000-00-00 00:00:00') “ශුන්ය” අගයට පරිවර්තනය වේ.
බහු-රේඛීය ප්රේරක නිර්වචනය කරන විට යමෙකුට පරිමිතිය වෙනස් කළ යුතු බැවින් අර්ධ සළකුණ 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;
ඔබ තීරුවේ නම දෙවරක් ඇතුළත් කළ යුත්තේ මන්දැයි මට කිසිදු ඉඟියක් නොමැත.
පෙරනිමි අගය දැන් () ලෙස සැකසීමට ඔබ උත්සාහ කරන්නේ නම්, MySQL එයට සහය දක්වයි යැයි මම නොසිතමි. MySQL හි, TIMESTAMP දත්ත වර්ග තීරුව හැර, ඔබට ඕනෑම ආකාරයක තීරු සඳහා පෙරනිමි අගයක් ලෙස ශ්රිතයක් හෝ ප්රකාශනයක් භාවිතා කළ නොහැක, ඒ සඳහා ඔබට පෙරනිමිය ලෙස CURRENT_TIMESTAMP නියම කළ හැකිය.
වර්තමාන කාලය (එම ඇතුළත් කිරීමේ වේලාව) ලබා දෙන, දැන් () ලෙස හඳුන්වන ඉන්බිල්ට් ශ්රිතය mysql සිට mysql හි සරල යැයි මම සිතමි.
එබැවින් ඔබේ විමසුම ඒ හා සමාන විය යුතුය
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'
)
'පරීක්ෂා කළ හැකි' නිර්මාණය කිරීම සඳහා ඉහත විමසුමේදී, මම DATETIME තීරුවේ පෙරනිමි අගය ලෙස '1999-12-12 12:12:12' භාවිතා කළෙමි. colname
පහත කේතය භාවිතා කරන්න
DELIMITER $$
CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
BEGIN
SET new.datefield = NOW();
END $$
DELIMITER ;
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;
නිදසුනක් ලෙස ගන්න, මට 'site' නමින් වගුවක් නිර්මාණය කර ඇති අතර එය යාවත්කාලින කළ තීරුවක් වන අතර එය DATETIME යන දෙකම වන අතර දැන් පෙරනිමි අගය අවශ්ය නම්, මෙය සාක්ෂාත් කර ගැනීම සඳහා මට පහත දැක්වෙන වර්ග අඩි ක්රියාත්මක කළ හැකිය.
වෙනත් වගුව `අඩවිය` වෙනස් කරන්න` සාදන ලද_අත්`` සාදන ලද_අත්` ටයිම්ස්ටැම්ප් සම්පූර්ණ අක්රීය නොවේ CURRENT_TIMESTAMP; වෙනත් වගුව `අඩවිය` වෙනස් කරන්න` සාදන ලද_අත්`` සාදන ලද_අත්` දිනය නිරුපද්රිතව අක්රීයයි; වෙනත් වගුව `අඩවිය` වෙනස් කරන්න` යාවත්කාලීන_අත්`` යාවත්කාලීන කළ_` කාලරාමුව සම්පූර්ණ අක්රීය නොවේ CURRENT_TIMESTAMP; වෙනත් වගුව `අඩවිය` වෙනස් කරන්න` යාවත්කාලීන_අත්`` යාවත්කාලීන කළ_` දින නියමය අක්රීයයි;
ප්රකාශ අනුක්රමය වැදගත් වන්නේ CUREENT TIMESTAMP හි පෙරනිමි අගයන් සහිත 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();
ඔබට පෙරනිමි කාලරාමුව විසඳිය හැකිය. මුලින්ම ඔබ භාවිතා කරන්නේ කුමන අක්ෂර කට්ටලයද යන්න සලකා බලන්න. ඔබ utf8 ලබා ගත්තේ නම් මෙම අක්ෂර කට්ටලය සියලුම භාෂාවන්ට සහය දක්වයි. ඊළඟ සැකසුම ඔබ කිසියම් ව්යාපෘතියක් යටතේ වැඩ කරන්නේ නම් ඔබ සේවාදායක කාල කලාපය දැනගෙන ඔබ සේවාදායක කලාපය තෝරා ගත යුතුය. මෙම පියවර අනිවාර්ය වේ.