兰色精灵 发表于 2015-1-16 20:13:15

绝无经由的MySQL数据库中设列的默许值为Now()的先容

DBaaS解决方案可以降低首次投入成本,对于那些小企业来说,他们往往认为内部部署的数据库成本太高,DBaaS的成本和灵活性优势对小企业吸引力更大,他们是云数据库解决方案的重点客户群体。MySQL今朝不撑持列的Default为函数的情势,<Pstyle="TEXT-INDENT:2em">如到达你某列的默许值为以后更新日期与工夫的功效,<Pstyle="TEXT-INDENT:2em">你可使用TIMESTAMP列范例<Pstyle="TEXT-INDENT:2em">上面就具体申明TIMESTAMP列范例:  <Pstyle="TEXT-INDENT:2em">TIMESTAMP列范例<Pstyle="TEXT-INDENT:2em">TIMESTAMP值能够从1970的某时的入手下手一向到2037年,精度为一秒,其值作为数字显现。<Pstyle="TEXT-INDENT:2em">TIMESTAMP值显现尺寸的格局以下表所示:<Pstyle="TEXT-INDENT:2em">+---------------+----------------+<Pstyle="TEXT-INDENT:2em">|列范例    |显现格局   |<Pstyle="TEXT-INDENT:2em">|TIMESTAMP(14)|YYYYMMDDHHMMSS| <Pstyle="TEXT-INDENT:2em">|TIMESTAMP(12)|YYMMDDHHMMSS |<Pstyle="TEXT-INDENT:2em">|TIMESTAMP(10)|YYMMDDHHMM  |<Pstyle="TEXT-INDENT:2em">|TIMESTAMP(8) |YYYYMMDD   |<Pstyle="TEXT-INDENT:2em">|TIMESTAMP(6) |YYMMDD    |<Pstyle="TEXT-INDENT:2em">|TIMESTAMP(4) |YYMM     |<Pstyle="TEXT-INDENT:2em">|TIMESTAMP(2) |YY      |<Pstyle="TEXT-INDENT:2em">+---------------+----------------+<Pstyle="TEXT-INDENT:2em">“完全”TIMESTAMP格局是14位,但TIMESTAMP列也能够用更短的显现尺寸制造<Pstyle="TEXT-INDENT:2em">最多见的显现尺寸是6、8、12、和14。<Pstyle="TEXT-INDENT:2em">你能够在创立表时指定一个恣意的显现尺寸,可是界说列长为0或比14年夜均会被强迫界说为列长14。<Pstyle="TEXT-INDENT:2em">列长在从1~13局限的奇数值尺寸均被强迫为下一个更年夜的偶数。  <Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">界说字段长度  强迫字段长度<Pstyle="TEXT-INDENT:2em">TIMESTAMP(0)-> TIMESTAMP(14)<Pstyle="TEXT-INDENT:2em">TIMESTAMP(15)-> TIMESTAMP(14)<Pstyle="TEXT-INDENT:2em">TIMESTAMP(1)-> TIMESTAMP(2)<Pstyle="TEXT-INDENT:2em">TIMESTAMP(5)-> TIMESTAMP(6)  <Pstyle="TEXT-INDENT:2em">一切的TIMESTAMP列都有一样的存储巨细,<Pstyle="TEXT-INDENT:2em">利用被指定的时代工夫值的完全精度(14位)存储正当的值不思索显现尺寸。<Pstyle="TEXT-INDENT:2em">分歧法的日期,将会被强迫为0存储  <Pstyle="TEXT-INDENT:2em">这有几个含义:<Pstyle="TEXT-INDENT:2em">1、固然你建表时界说了列TIMESTAMP(8),但在你举行数据拔出与更新时TIMESTAMP列实践上保留了14位的数据(包含年代日时分秒),只不外在你举行查询时MySQL前往给你的是8位的年代日数据。假如你利用ALTERTABLE拓宽一个局促的TIMESTAMP列,之前被“潜伏”的信息将被显现。<Pstyle="TEXT-INDENT:2em">2、一样,减少一个TIMESTAMP列不会招致信息得到,除感到上值在显现时,较少的信息被显现出。<Pstyle="TEXT-INDENT:2em">3、只管TIMESTAMP值被存储为完全精度,间接操纵存储值的独一函数是UNIX_TIMESTAMP();因为MySQL前往TIMESTAMP列的列值是进过格局化后的检索的值,这意味着你大概不克不及利用某些函数来操纵TIMESTAMP列(比方HOUR()或SECOND()),除非TIMESTAMP值的相干部分被包括在格局化的值中。比方,一个TIMESTAMP列只要被界说为TIMESTAMP(10)以上时,TIMESTAMP列的HH部分才会被显现,因而在更短的TIMESTAMP值上利用HOUR()会发生一个不成预知的了局。<Pstyle="TEXT-INDENT:2em">4、分歧法TIMESTAMP值被变更到得当范例的“零”值(00000000000000)。(DATETIME,DATE亦然)  你可使用以下语句来考证:<Pstyle="TEXT-INDENT:2em">CREATETABLEtest(idINT(3)UNSIGNEDAUTO_INCREMENT,date1TIMESTAMP(8)PRIMARYKEY(id));<Pstyle="TEXT-INDENT:2em">INSERTINTOtestSETid=1;<Pstyle="TEXT-INDENT:2em">SELECT*FROMtest;<Pstyle="TEXT-INDENT:2em">+----+----------------+<Pstyle="TEXT-INDENT:2em">|id|date1     |<Pstyle="TEXT-INDENT:2em">+----+----------------+<Pstyle="TEXT-INDENT:2em">| 1|20021114   |<Pstyle="TEXT-INDENT:2em">+----+----------------+<Pstyle="TEXT-INDENT:2em">ALTERTABLEtestCHANGEdate1date1TIMESTAMP(14);<Pstyle="TEXT-INDENT:2em">SELECT*FROMtest;<Pstyle="TEXT-INDENT:2em">+----+----------------+<Pstyle="TEXT-INDENT:2em">|id|date1     |<Pstyle="TEXT-INDENT:2em">+----+----------------+<Pstyle="TEXT-INDENT:2em">| 1|20021114093723|<Pstyle="TEXT-INDENT:2em">+----+----------------+<Pstyle="TEXT-INDENT:2em">你可使用TIMESTAMP列范例主动地用以后的日期和工夫标志INSERT或UPDATE的操纵。<Pstyle="TEXT-INDENT:2em">假如你有多个TIMESTAMP列,只要第一个主动更新。<Pstyle="TEXT-INDENT:2em">主动更新第一个TIMESTAMP列鄙人列任何前提下产生:  <Pstyle="TEXT-INDENT:2em">1、列值没有明白地在一个INSERT或LOADDATAINFILE语句中指定。<Pstyle="TEXT-INDENT:2em">2、列值没有明白地在一个UPDATE语句中指定且别的一些的列改动值。(注重一个UPDATE设置一个列为它已有的值,这将不引发TIMESTAMP列被更新,由于假如你设置一个列为它以后的值,MySQL为了效力而疏忽变动。)<Pstyle="TEXT-INDENT:2em">3、你明白地设定TIMESTAMP列为NULL.<Pstyle="TEXT-INDENT:2em">4、除第一个之外的TIMESTAMP列也能够设置到以后的日期和工夫,只需将列设为NULL,或NOW()。  <Pstyle="TEXT-INDENT:2em">CREATETABLEtest(<Pstyle="TEXT-INDENT:2em">idINT(3)UNSIGNEDAUTO_INCREMENT,<Pstyle="TEXT-INDENT:2em">date1TIMESTAMP(14),<Pstyle="TEXT-INDENT:2em">date2TIMESTAMP(14),<Pstyle="TEXT-INDENT:2em">PRIMARYKEY(id)<Pstyle="TEXT-INDENT:2em">);  <Pstyle="TEXT-INDENT:2em">INSERTINTOtest(id,date1,date2)VALUES(1,NULL,NULL);<Pstyle="TEXT-INDENT:2em">INSERTINTOtestSETid=2;<Pstyle="TEXT-INDENT:2em">+----+----------------+----------------+<Pstyle="TEXT-INDENT:2em">|id|date1     |date2     |<Pstyle="TEXT-INDENT:2em">+----+----------------+----------------+<Pstyle="TEXT-INDENT:2em">| 1|20021114093723|20021114093723|<Pstyle="TEXT-INDENT:2em">| 2|20021114093724|00000000000000|+----+----------------+----------------+

<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">->第一条指令因设date1、date2为NULL,以是date1、date2值均为以后工夫<Pstyle="TEXT-INDENT:2em">第二条指令因没有设date1、date2列值,第一个TIMESTAMP列date1为更新为以后工夫,<Pstyle="TEXT-INDENT:2em">而二个TIMESTAMP列date2因日期分歧法而变成“00000000000000”  <Pstyle="TEXT-INDENT:2em">UPDATEtestSETid=3WHEREid=1;<Pstyle="TEXT-INDENT:2em">+----+----------------+----------------+<Pstyle="TEXT-INDENT:2em">|id|date1     |date2     |<Pstyle="TEXT-INDENT:2em">+----+----------------+----------------+<Pstyle="TEXT-INDENT:2em">| 3|20021114094009|20021114093723|<Pstyle="TEXT-INDENT:2em">| 2|20021114093724|00000000000000|<Pstyle="TEXT-INDENT:2em">+----+----------------+----------------+<Pstyle="TEXT-INDENT:2em">->这条指令没有明白地设定date2的列值,以是第一个TIMESTAMP列date1将被更新为以后工夫  <Pstyle="TEXT-INDENT:2em">UPDATEtestSETid=1,date1=date1,date2=NOW()WHEREid=3;<Pstyle="TEXT-INDENT:2em">+----+----------------+----------------+<Pstyle="TEXT-INDENT:2em">|id|date1     |date2     |<Pstyle="TEXT-INDENT:2em">+----+----------------+----------------+<Pstyle="TEXT-INDENT:2em">| 1|20021114094009|20021114094320|<Pstyle="TEXT-INDENT:2em">| 2|20021114093724|00000000000000|<Pstyle="TEXT-INDENT:2em">+----+----------------+----------------+<Pstyle="TEXT-INDENT:2em">->这条指令因设定date1=date1,以是在更新数据时date1列值其实不会产生改动<Pstyle="TEXT-INDENT:2em">而因设定date2=NOW(),以是在更新数据时date2列值会被更新为以后工夫<Pstyle="TEXT-INDENT:2em">此指令等效为UPDATEtestSETid=1,date1=date1,date2=NULLWHEREid=3;   <Pstyle="TEXT-INDENT:2em">因MySQL前往的TIMESTAMP列为数字显现情势,<Pstyle="TEXT-INDENT:2em">你能够用DATE_FROMAT()函数来格局化TIMESTAMP列<Pstyle="TEXT-INDENT:2em">SELECTid,DATE_FORMAT(date1,%Y-%m-%d%H:%i:%s)Asdate1,<Pstyle="TEXT-INDENT:2em">DATE_FORMAT(date2,%Y-%m-%d%H:%i:%s)Asdate2FROMtest;<Pstyle="TEXT-INDENT:2em">+----+---------------------+---------------------+<Pstyle="TEXT-INDENT:2em">|id|date1       |date2       |<Pstyle="TEXT-INDENT:2em">+----+---------------------+---------------------+<Pstyle="TEXT-INDENT:2em">| 1|2002-11-1409:40:09|2002-11-1409:43:20|<Pstyle="TEXT-INDENT:2em">| 2|2002-11-1409:37:24|0000-00-0000:00:00|<Pstyle="TEXT-INDENT:2em">+----+---------------------+---------------------+<Pstyle="TEXT-INDENT:2em">SELECTid,DATE_FORMAT(date1,%Y-%m-%d)Asdate1,<Pstyle="TEXT-INDENT:2em">DATE_FORMAT(date2,%Y-%m-%d)Asdate2FROMtest;<Pstyle="TEXT-INDENT:2em">+----+-------------+-------------+<Pstyle="TEXT-INDENT:2em">|id|date1   |date2   |<Pstyle="TEXT-INDENT:2em">+----+-------------+-------------+<Pstyle="TEXT-INDENT:2em">| 1|2002-11-14 |2002-11-14 |<Pstyle="TEXT-INDENT:2em">| 2|2002-11-14 |0000-00-00 |<Pstyle="TEXT-INDENT:2em">+----+-------------+-------------+  <Pstyle="TEXT-INDENT:2em">在某种水平上,你能够把一种日期范例的值赋给一个分歧的日期范例的工具。<Pstyle="TEXT-INDENT:2em">而特别注重的是:值有大概产生一些改动或信息的丧失:  <Pstyle="TEXT-INDENT:2em">1、假如你将一个DATE值赋给一个DATETIME或TIMESTAMP工具,了局值的工夫部分被设置为00:00:00,由于DATE值中不包括偶然间信息。  <Pstyle="TEXT-INDENT:2em">2、假如你将一个DATETIME或TIMESTAMP值赋给一个DATE工具,了局值的工夫部分被删除,由于DATE范例不存储工夫信息。<Pstyle="TEXT-INDENT:2em">3、只管DATETIME,DATE和TIMESTAMP值全都能够用一样的格局集来指定,<Pstyle="TEXT-INDENT:2em">但一切范例不都有一样的值局限。<Pstyle="TEXT-INDENT:2em">比方,TIMESTAMP值不克不及比1970早,也不克不及比2037晚,<Pstyle="TEXT-INDENT:2em">这意味着,一个日期比方1968-01-01,看成为一个DATETIME或DATE值时它是正当的,<Pstyle="TEXT-INDENT:2em">但它不是一个准确TIMESTAMP值!而且假如将如许的一个工具赋值给TIMESTAMP列,它将被变更为0。当指定日期值时,小心某些缺点:  <Pstyle="TEXT-INDENT:2em">1、同意作为字符串指定值的宽松格局能被棍骗。比方,,由于“:”分开符的利用,值10:11:12大概看起来像工夫值,可是假如在一个日期中利用,高低文将作为年份被注释成2010-11-12。值10:45:15将被变更到0000-00-00,由于45不是一个正当的月份。    2、以2位数字指定的年值是含混的,由于世纪是未知的。MySQL利用以下划定规矩注释2位年值:在00-69局限的年值被变更到2000-2069。在局限70-99的年值被变更到1970-1999。
不可否认,MySQL也是一个很好的关系型数据库,或许在技术上它与其他领先的关系数据库相差并不大,或不具有劣势。但是,对于一些企业环境来说,MySQL显然不具有优势。

不帅 发表于 2015-1-18 18:50:23

可以动态传入参数,省却了动态SQL的拼写。

谁可相欹 发表于 2015-1-25 14:00:41

发几份SQL课件,以飨阅者

简单生活 发表于 2015-2-2 22:20:52

其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!

活着的死人 发表于 2015-2-8 14:37:40

一个是把SQL语句写到客户端,可以使用DataSet进行加工;

变相怪杰 发表于 2015-2-25 19:34:47

不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?

透明 发表于 2015-3-8 02:47:54

这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。

小女巫 发表于 2015-3-15 21:06:51

另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);

若相依 发表于 2015-3-22 04:16:21

外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。
页: [1]
查看完整版本: 绝无经由的MySQL数据库中设列的默许值为Now()的先容