how - time type in mysql




كيف تقوم بتعيين قيمة افتراضية لعمود Datetime MySQL؟ (16)

كيف تقوم بتعيين قيمة افتراضية لعمود Datetime MySQL؟

في SQL Server فإنه getdate() . ما هو مرادف ل MySQL؟ أنا أستخدم MySQL 5.x إذا كان ذلك عاملاً.


أثناء تعريف المشغلات متعددة الأسطر ، يجب على المرء أن يغير المحدد ، حيث يتم أخذ الفاصلة المنقوطة من خلال برنامج 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 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'

يعمل فقط .

كما sidenote ، هو مذكور في المستندات 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').


إذا كنت تحاول تعيين القيمة الافتراضية كـ NOW () ، لا أعتقد أن MySQL يدعم ذلك. في MySQL ، لا يمكنك استخدام دالة أو تعبير كقيمة افتراضية لأي نوع من العمود ، باستثناء عمود نوع البيانات TIMESTAMP ، والذي يمكنك تعيين 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';

استخدم التعليمة البرمجية التالية

DELIMITER $$

    CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
    BEGIN
      SET new.datefield = NOW();
    END $$

    DELIMITER ;

بالنسبة لي ، نجح نهج الزناد ، لكنني وجدت عقبة في هذا النهج. ضع في اعتبارك المشغل الأساسي لتعيين حقل تاريخ إلى الوقت الحالي عند الإدراج:

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 () في تعريف الجدول ، لكننا نقترب!


على الرغم من أنه لا يمكنك فعل ذلك مع DATETIME في التعريف الافتراضي ، يمكنك ببساطة تضمين عبارة محددة في عبارة الإدخال الخاصة بك مثل:

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

لاحظ عدم وجود علامات اقتباس حول الجدول.

بالنسبة إلى MySQL 5.5


في الإصدار 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


لجميع أولئك الذين فقدوا قلوبهم يحاولون ضبط قيمة DATETIME الافتراضية في MySQL ، أعرف بالضبط كيف تشعر / تشعر. إذن هنا هو:

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

لاحظ بعناية أني لم أضف اقتباسات فردية / علامات اقتباس مزدوجة حول 0

أنا قفز حرفيا بعد حل هذا واحد: د


لجميع الذين يستخدمون العمود TIMESTAMP كحل أريد أن الثاني القيد التالي من الدليل:

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 عامًا.

أعتقد أن الحل الوحيد على جانب قاعدة البيانات هو استخدام المشغلات مثل المذكورة في إجابات أخرى.


هذا هو المثال الخاص بي:

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



يمكنك الآن استخدام () لتعيين قيمة عمود التاريخ والوقت ، ولكن ضع في اعتبارك أنه لا يمكنك استخدام ذلك كقيمة افتراضية.


يمكنك حل الطابع الزمني الافتراضي. أولاً ضع في اعتبارك مجموعة الأحرف التي تستخدمها على سبيل المثال إذا كان u utf8 مجموعة الأحرف هذه تدعم كافة اللغات وإذا تم أخذه laten1 فإن مجموعة الأحرف هذه تدعم فقط للغة الإنجليزية. التالي setp إذا كنت تعمل تحت أي مشروع يجب أن تعرف المنطقة الزمنية للعميل واخترت منطقة العميل. هذه الخطوة إلزامية.


IMPORTANT EDIT: من الممكن الآن تحقيق ذلك باستخدام حقول 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 **


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" كقيمة افتراضية colname عمود colname DATETIME





datetime