搜索
首页数据库mysql教程MYSQL中如何设置列默认值的介绍_MySQL

bitsCN.com

MYSQL中如何设置列默认值的介绍

 

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列都有同样的存储大小,使用被指定的时期时间值的完整精度(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 列为数字显示形式,你可以用DATE_FROMAT()函数来格式化 TIMESTAMP 列。

  SELECT id,DATE_FORMAT(date1,'%Y-%m-%d %H:%i:%s') As date1,      DATE_FORMAT(date2,'%Y-%m-%d %H:%i:%s') As date2 FROM test;  +----+---------------------+---------------------+  | id | date1        | date2        |  +----+---------------------+---------------------+  | 1 | 2002-11-14 09:40:09 | 2002-11-14 09:43:20 |  | 2 | 2002-11-14 09:37:24 | 0000-00-00 00:00:00 |  +----+---------------------+---------------------+    SELECT id,DATE_FORMAT(date1,'%Y-%m-%d') As date1,      DATE_FORMAT(date2,'%Y-%m-%d') As date2 FROM test;       +----+-------------+-------------+  | id | date1    | date2    |  +----+-------------+-------------+  | 1 | 2002-11-14 | 2002-11-14 |  | 2 | 2002-11-14 | 0000-00-00 |  +----+-------------+-------------+

 

 

  在某种程度上,你可以把一种日期类型的值赋给一个不同的日期类型的对象。然而,而尤其注意的是:值有可能发生一些改变或信息的损失: 

  

  1、如果你将一个DATE值赋给一个DATETIME或TIMESTAMP对象,结果值的时间部分被设置为'00:00:00',因为DATE值中不包含有时间信息。

 

  2、如果你将一个DATETIME或TIMESTAMP值赋给一个DATE对象,结果值的时间部分被删除,因为DATE类型不存储时间信息。 

 

  3、尽管DATETIME, DATE和TIMESTAMP值全都可以用同样的格式集来指定,但所有类型不都有同样的值范围。例如,TIMESTAMP值不能比1970早,也不能比2037晚,这意味着,一个日期例如'1968-01-01',当作为一个DATETIME或DATE值时它是合法的,但它不是一个正确TIMESTAMP值!并且如果将这样的一个对象赋值给TIMESTAMP列,它将被变换为0。 

  

  当指定日期值时,当心某些缺陷: 

  

  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。

 

bitsCN.com
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
您如何在MySQL中创建和管理用户帐户?您如何在MySQL中创建和管理用户帐户?Apr 22, 2025 pm 06:05 PM

在MySQL中创建和管理用户账户的步骤如下:1.创建用户:使用CREATEUSER'newuser'@'localhost'IDENTIFIEDBY'password';2.分配权限:使用GRANTSELECT,INSERT,UPDATEONmydatabase.TO'newuser'@'localhost';3.修正权限错误:使用REVOKEALLPRIVILEGESONmydatabase.FROM'newuser'@'localhost';然后重新分配权限;4.优化权限:使用SHOWGRA

MySQL与Oracle有何不同?MySQL与Oracle有何不同?Apr 22, 2025 pm 05:57 PM

MySQL适合快速开发和中小型应用,Oracle适合大型企业和高可用性需求。1)MySQL开源、易用,适用于Web应用和中小型企业。2)Oracle功能强大,适合大型企业和政府机构。3)MySQL支持多种存储引擎,Oracle提供丰富的企业级功能。

与其他关系数据库相比,使用MySQL的缺点是什么?与其他关系数据库相比,使用MySQL的缺点是什么?Apr 22, 2025 pm 05:49 PM

MySQL相比其他关系型数据库的劣势包括:1.性能问题:在处理大规模数据时可能遇到瓶颈,PostgreSQL在复杂查询和大数据处理上表现更优。2.扩展性:水平扩展能力不如GoogleSpanner和AmazonAurora。3.功能限制:在高级功能上不如PostgreSQL和Oracle,某些功能需要更多自定义代码和维护。

您如何在MySQL中执行加入操作?您如何在MySQL中执行加入操作?Apr 22, 2025 pm 05:41 PM

MySQL支持四种JOIN类型:INNERJOIN、LEFTJOIN、RIGHTJOIN和FULLOUTERJOIN。1.INNERJOIN用于匹配两个表中的行并返回符合条件的结果。2.LEFTJOIN返回左表的所有行,即使右表没有匹配。3.RIGHTJOIN与LEFTJOIN相反,返回右表的所有行。4.FULLOUTERJOIN返回两表中所有符合或不符合条件的行。

MySQL的性能与高负载下的其他RDBM相比如何?MySQL的性能与高负载下的其他RDBM相比如何?Apr 22, 2025 pm 05:37 PM

MySQL在高负载下的性能与其他RDBMS相比各有优劣。1)MySQL通过InnoDB引擎和优化策略如索引、查询缓存和分区表在高负载下表现良好。2)PostgreSQL通过MVCC机制提供高效并发读写,Oracle和MicrosoftSQLServer则通过各自的优化策略提升性能。通过合理的配置和优化,MySQL可以在高负载环境中表现出色。

解释InnoDB缓冲池及其对性能的重要性。解释InnoDB缓冲池及其对性能的重要性。Apr 19, 2025 am 12:24 AM

InnoDBBufferPool通过缓存数据和索引页来减少磁盘I/O,提升数据库性能。其工作原理包括:1.数据读取:从BufferPool中读取数据;2.数据写入:修改数据后写入BufferPool并定期刷新到磁盘;3.缓存管理:使用LRU算法管理缓存页;4.预读机制:提前加载相邻数据页。通过调整BufferPool大小和使用多个实例,可以优化数据库性能。

MySQL与其他编程语言:一种比较MySQL与其他编程语言:一种比较Apr 19, 2025 am 12:22 AM

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。 MySQL以其高性能、可扩展性和跨平台支持着称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

学习MySQL:新用户的分步指南学习MySQL:新用户的分步指南Apr 19, 2025 am 12:19 AM

MySQL值得学习,因为它是强大的开源数据库管理系统,适用于数据存储、管理和分析。1)MySQL是关系型数据库,使用SQL操作数据,适合结构化数据管理。2)SQL语言是与MySQL交互的关键,支持CRUD操作。3)MySQL的工作原理包括客户端/服务器架构、存储引擎和查询优化器。4)基本用法包括创建数据库和表,高级用法涉及使用JOIN连接表。5)常见错误包括语法错误和权限问题,调试技巧包括检查语法和使用EXPLAIN命令。6)性能优化涉及使用索引、优化SQL语句和定期维护数据库。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具