怎样设列的默认值为Now()

2024-02-21 08:18
文章标签 怎样 默认值 设列

本文主要是介绍怎样设列的默认值为Now(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MySQL目前不支持列的Default  为函数的形式,  
如达到你某列的默认值为当前更新日期与时间的功能,  
你可以使用TIMESTAMP列类型  
下面就详细说明TIMESTAMP列类型  
 
 
TIMESTAMP列类型  
TIMESTAMP值可以从1970的某时的开始一直到2037年,精度为一秒,其值作为数字显示。  
TIMESTAMP值显示尺寸的格式如下表所示:  
:  
+---------------+----------------+  
 ¦  列类型                  ¦  显示格式                ¦  
 ¦  TIMESTAMP(14)    ¦  YYYYMMDDHHMMSS    ¦      
 ¦  TIMESTAMP(12)    ¦  YYMMDDHHMMSS        ¦  
 ¦  TIMESTAMP(10)    ¦  YYMMDDHHMM            ¦  
 ¦  TIMESTAMP(8)      ¦  YYYYMMDD                ¦  
 ¦  TIMESTAMP(6)      ¦  YYMMDD                    ¦  
 ¦  TIMESTAMP(4)      ¦  YYMM                        ¦  
 ¦  TIMESTAMP(2)      ¦  YY                            ¦  
+---------------+----------------+  
“完整”TIMESTAMP格式是14位,但TIMESTAMP列也可以用更短的显示尺寸创造  
最常见的显示尺寸是6、8、12、和14。  
你可以在创建表时指定一个任意的显示尺寸,但是定义列长为0或比14大均会被强制定义为列长14。  
列长在从1~13范围的奇数值尺寸均被强制为下一个更大的偶数。  
 
列如:  
定义字段长度          强制字段长度  
TIMESTAMP(0)  ->    TIMESTAMP(14)  
TIMESTAMP(15)->    TIMESTAMP(14)  
TIMESTAMP(1)  ->    TIMESTAMP(2)  
TIMESTAMP(5)  ->    TIMESTAMP(6)  
 
所有的TIMESTAMP列都有同样的存储大小,  
使用被指定的时期时间值的完整精度(14位)存储合法的值不考虑显示尺寸。  
不合法的日期,将会被强制为0存储  
这有几个含意:    
       1、虽然你建表时定义了列TIMESTAMP(8),但在你进行数据插入与更新时TIMESTAMP列  
                     实际上保存了14位的数据(包括年月日时分秒),  
                     只不过在你进行查询时MySQL返回给你的是8位的年月日数据。  
                     如果你使用ALTER  TABLE拓宽一个狭窄的TIMESTAMP列,以前被“隐蔽”的信息将被显示。    
       2、同样,缩小一个TIMESTAMP列不会导致信息失去,除了感觉上值在显示时,较少的信息被显示出。    
       3、尽管TIMESTAMP值被存储为完整精度,直接操作存储值的唯一函数是UNIX_TIMESTAMP();  
                     由于MySQL返回TIMESTAMP列的列值是进过格式化后的检索的值,  
                     这意味着你可能不能使用某些函数来操作TIMESTAMP列(例如HOUR()或SECOND()),  
                     除非TIMESTAMP值的相关部分被包含在格式化的值中。  
                     例如,一个TIMESTAMP列只有被定义为TIMESTAMP(10)以上时,TIMESTAMP列的HH部分才会被显示,  
                     因此在更短的TIMESTAMP值上使用HOUR()会产生一个不可预知的结果。  
       4、不合法TIMESTAMP值被变换到适当类型的“零”值(00000000000000)。(DATETIME,DATE亦然)                  
 
你可以使用下列语句来验证:  
CREATE  TABLE  test  ('id'  INT  (3)  UNSIGNED  AUTO_INCREMENT,  'date1'  TIMESTAMP  (8)  PRIMARY  KEY('id'));  
INSERT  INTO  test  SET  id  =  1;  
SELECT  *  FROM  test;  
+----+----------------+  
 ¦  id    ¦  date1                      ¦  
+----+----------------+  
 ¦    1    ¦  20021114                ¦  
+----+----------------+  
ALTER  TABLE  test  CHANGE  'date1'  'date1'  TIMESTAMP(14);  
SELECT  *  FROM  test;  
+----+----------------+  
 ¦  id    ¦  date1                      ¦  
+----+----------------+  
 ¦    1    ¦  20021114093723    ¦  
+----+----------------+  
 
 
 
你可以使用TIMESTAMP列类型自动地用当前的日期和时间标记INSERT或UPDATE的操作。  
如果你有多个TIMESTAMP列,只有第一个自动更新。    
自动更新第一个TIMESTAMP列在下列任何条件下发生:    
 
     1、列值没有明确地在一个INSERT或LOAD  DATA  INFILE语句中指定。    
     2、列值没有明确地在一个UPDATE语句中指定且另外一些的列改变值。  
             (注意一个UPDATE设置一个列为它已经有的值,  
               这将不引起TIMESTAMP列被更新,  
               因为如果你设置一个列为它当前的值,MySQL为了效率而忽略更改。)    
     3、你明确地设定TIMESTAMP列为NULL.    
     4、除第一个以外的TIMESTAMP列也可以设置到当前的日期和时间,只要将列设为NULL,或NOW()。  
 
 
CREATE  TABLE  test  (  
         'id'  INT  (3)  UNSIGNED  AUTO_INCREMENT,    
         'date1'  TIMESTAMP  (14),  
         'date2'  TIMESTAMP  (14),  
           PRIMARY  KEY('id')  
           );  
 
INSERT  INTO  test  (id,  date1,  date2)  VALUES  (1,  NULL,  NULL);  
INSERT  INTO  test  SET  id=  2;  
+----+----------------+----------------+  
 ¦  id    ¦  date1                      ¦  date2                      ¦  
+----+----------------+----------------+  
 ¦    1    ¦  20021114093723    ¦  20021114093723    ¦  
 ¦    2    ¦  20021114093724    ¦  00000000000000    ¦  
+----+----------------+----------------+  
->第一条指令因设date1、date2为NULL,所以date1、date2值均为当前时间  
   第二条指令因没有设date1、date2列值,第一个TIMESTAMP列date1为更新为当前时间,  
       而二个TIMESTAMP列date2因日期不合法而变为“00000000000000”  
 
 
UPDATE  test  SET  id=  3  WHERE  id=1;  
+----+----------------+----------------+  
 ¦  id    ¦  date1                      ¦  date2                      ¦  
+----+----------------+----------------+  
 ¦    3    ¦  20021114094009    ¦  20021114093723    ¦  
 ¦    2    ¦  20021114093724    ¦  00000000000000    ¦  
+----+----------------+----------------+  
->这条指令没有明确地设定date2的列值,所以第一个TIMESTAMP列date1将被更新为当前时间  
 
 
UPDATE  test  SET  id=  1,date1=date1,date2=NOW()  WHERE  id=3;  
+----+----------------+----------------+  
 ¦  id    ¦  date1                      ¦  date2                      ¦  
+----+----------------+----------------+  
 ¦    1    ¦  20021114094009    ¦  20021114094320    ¦  
 ¦    2    ¦  20021114093724    ¦  00000000000000    ¦  
+----+----------------+----------------+  
->这条指令因设定date1=date1,所以在更新数据时date1列值并不会发生改变  
   而因设定date2=NOW(),所以在更新数据时date2列值会被更新为当前时间  
   此指令等效为  UPDATE  test  SET  id=  1,date1=date1,date2=NULL  WHERE  id=3;  
     
因MySQL返回的  TIMESTAMP  列为数字显示形式,  

这篇关于怎样设列的默认值为Now()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/731111

相关文章

LabVIEW程序员是怎样成长为大佬

成为一名LabVIEW编程领域的“大佬”需要时间、实践、学习和解决复杂问题的经验。尽管LabVIEW作为一种图形化编程语言在初期可能相对容易上手,但要真正成为精通者,需要在多个层面上深入理解。以下是LabVIEW程序员如何逐步成长为“大佬”的路径: 1. 打好基础 LabVIEW的大佬们通常在初期会打下非常坚实的基础,理解LabVIEW编程的核心概念,包括: 数据流编程模型:Lab

十四、我们应当怎样做需求分析:子用例与扩展用例

用例模型作为UML中4+1视图中非常重要的一员,非常集中地体现了面向对象的分析与设计思想。用例模型将现实世界中连续的一个一个业务流程,按照场景划分到了一个一个的用例中。由于场景的出现,使得用例中的业务流程存在着高度的内聚性,从而成为了日后各种对象的雏形。同时,在用例分析中,又将那些存在于各个用例中的,相同或相近的业务操作提取出来,形成一个一个的子用例或扩展用例,又体现了面向对象设计中的复用性。现在

十三、我们应当怎样做需求分析:查询报表分析

在我以往的用例分析中,使用这样格式的用例模式,对于大多数业务操作流程来说是得心应手的,但对于有些功能来说总感觉不对劲。感觉不对劲的,就是那些查询、汇总与报表功能。对于这部分功能,需要我们描述的不是什么操作流程,而更重要的是那些数据项、数据来源、报表格式、数据链接,以及使用者、使用频率的说明。而这些,在以往的用例说明格式中统统都没有,怎么办呢?俗话说“东西是死的人是活的”,把我们的用例格式改改吧。

九、我们应当怎样做需求分析:功能角色分析与用例图

在我们进行一系列需求调研工作的同时,我们的需求分析工作也开始启动了。需求调研与需求分析工作应当是相辅相伴共同进行的。每次参加完需求调研回到公司,我们就应当对需求调研的成果进行一次需求分析。当下一次开始进行需求调研时,我们应当首先将上次需求分析的结果与客户进行确认,同时对需求分析中提出的疑问交给客户予以解答。这就是一个需求捕获->需求整理->需求验证->再需求捕获的过程。  但是,当我们经

八、我们应当怎样做需求调研:需求捕获(下)

前面我们讨论了,需求分析工作是一个迭代的过程:需求捕获->需求整理->需求验证->再需求捕获······需求捕获是这个迭代过程的开始,也是整个需求分析工作中最重要的部分。没有捕获哪来后面的整理与验证工作?但是,非常遗憾,按照我以往的经验,需求捕获是我们最薄弱的环节。前面我提到的许许多多项目开发的问题都可以归结为需求分析的问题,而许许多多需求分析的问题又都可以归结为需求捕获不完整的问题。需求捕获是整

七、我们应当怎样做需求调研:需求捕获(上)

前面我们讨论了,需求分析工作是一个迭代的过程:需求捕获->需求整理->需求验证->再需求捕获······需求捕获是这个迭代过程的开始,也是整个需求分析工作中最重要的部分。没有捕获哪来后面的整理与验证工作?但是,非常遗憾,按照我以往的经验,需求捕获是我们最薄弱的环节。前面我提到的许许多多项目开发的问题都可以归结为需求分析的问题,而许许多多需求分析的问题又都可以归结为需求捕获不完整的问题。需求捕获是整

六、我们应当怎样做需求调研:迭代

前面我一直在反复强调这样一个观点,需求分析不是一蹴而就的,是一个反复迭代的过程。它将从第一次需求分析开始,一直持续到整个项目生命周期。为什么这样说呢?让我们一起来分析分析。  在第一次的需求分析阶段,我们在一段时期内需要与客户进行反复地讨论,这个过程往往是这样一个反复循环的过程:需求捕获->需求整理->需求验证->再需求捕获••••••  需求捕获,就是我们与客户在一起开研讨会

五、我们应当怎样做需求调研:需求研讨

前面我们探讨了业务研讨会应当怎样组织,下面我们再具体讨论一下我们应当怎样与客户讨论业务需求。如果说组织业务研讨会是项目经理的功底,那么讨论业务需求就是需求分析人员的功底。  以往我们常常认为,需求分析是一件最简单的事情。客户说他们需要做一个什么软件,有些什么功能,我们照着做就可以了,所谓的需求分析员就是需求的记录员。我要说,这是一个极大的错误,许多失败的软件项目,或者说软件项目中的需求问

面试官:synchronized的锁升级过程是怎样的?

大家好,我是大明哥,一个专注「死磕 Java」系列创作的硬核程序员。 回答 在 JDK 1.6之前,synchronized 是一个重量级、效率比较低下的锁,但是在JDK 1.6后,JVM 为了提高锁的获取与释放效,,对 synchronized 进行了优化,引入了偏向锁和轻量级锁,至此,锁的状态有四种,级别由低到高依次为:无锁、偏向锁、轻量级锁、重量级锁。 锁升级就是无锁 —>

【JavaScript】0.1 + 0.2 = 0.30000000000000004该怎样理解?

如果你以前没了解过类似的坑,乍一看似乎觉得不可思议。但是某些语言下事实确实如此(比如 Javascript): 再看个例子,+1 后居然等于原数,没天理啊! 如果你不知道原因,跟着楼主一起来探究下精度丢失的过程吧。 事实上不仅仅是 Javascript,在很多语言中 0.1 + 0.2 都会得到 0.30000000000000004,为此还诞生了一个好玩的网站 0.30000000