MSSQL 时间默认值

SQL Server 将 0 解释为 1900 年 1 月 1 日
最小日期:1753.1.1


Link URL: http://greece760.spaces.live.com/Blog/cns!D46310210000FC4!789.entry

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22104826/viewspace-609052/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22104826/viewspace-609052/

<think>好的,我现在要解决用户的问题:如何在MySQL中为时间字段(datetime或timestamp类型)设置默认值。用户提到了几个引用链接,我需要结合这些资料,同时确保回答符合中文和格式要求。 首先,我需要回忆MySQL中datetime和timestamp的区别。记得datetime的范围更大,从1000到9999年,而timestamp是1970到2038年,并且timestamp会转换时区,而datetime不会。这点很重要,因为默认值设置可能会有影响。 接下来,设置默认值的语法。用户提供的引用中有例子,比如引用[3]里的CREATE TABLE语句,使用DEFAULT CURRENT_TIMESTAMP。这说明在创建表时可以直接指定默认值。另外,引用[2]中的ALTER TABLE语句,使用ALTER COLUMN ... SET DEFAULT,这可能适用于修改现有表的结构。 不过要注意,MySQL的版本差异。比如在5.6.5之前,timestamp类型可以有默认CURRENT_TIMESTAMP,但只能有一个这样的列,而datetime类型不支持自动更新。之后的版本允许datetime也使用CURRENT_TIMESTAMP,并且timestamp可以有多个自动更新的列。需要提到这一点,避免用户因为版本问题遇到错误。 用户引用[4]提到了错误1067,关于无效的默认值。这可能是因为默认值不符合格式要求,或者sql_mode设置的问题。例如,NO_ZERO_DATE模式会禁止'0000-00-00'这样的默认值。需要提醒用户检查sql_mode,或者使用有效的日期格式。 然后,我需要整理步骤:创建表时设置默认值,修改已有表的默认值,处理自动更新属性,以及常见问题和解决方法。例如,使用CURRENT_TIMESTAMP或特定的日期字符串,如'1970-01-01 10:00:00'(如引用[2]所示)。 还需要注意语法是否正确,比如ALTER TABLE时,MySQL使用ALTER COLUMN ... SET DEFAULT,但根据引用[2]的例子,可能需要确认正确的语法。例如,引用[2]中的语句是“alter table tmp_wrh_1 alter column UPDATE_TIME set default '1970-01-01 10:00:00';”,但根据MySQL文档,正确的语法应该是ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT 'value'; 或者使用MODIFY COLUMN。可能需要核实,避免用户执行错误语句。 另外,自动更新的特性,即ON UPDATE CURRENT_TIMESTAMP,是否只能用于timestamp类型?在较新版本中,datetime也可以,但需要确认。例如,在5.6.5之后,datetime列也可以自动更新。 总结回答的结构:首先介绍两种时间类型的区别,然后分情况讨论如何设置默认值,包括创建表和修改表,自动更新的设置,常见错误及解决方法,如sql_mode的影响,版本差异等。最后生成相关问题。 需要确保使用正确的LaTeX格式,比如行内公式用$...$,独立公式用$$...$$,但在这个问题中可能用不到数学公式,但需要遵守其他格式要求,如代码块用反引号,引用标识自然添加。 最后,生成相关问题,例如如何修改默认值,处理错误,不同版本的差异等。确保问题相关且有帮助。</think>### MySQL时间字段设置默认值指南 #### 一、时间类型区别 MySQL中$DATETIME$和$TIMESTAMP$的主要差异: 1. **范围**:$DATETIME$范围是$1000-01-01\ 00:00:00$到$9999-12-31\ 23:59:59$,而$TIMESTAMP$范围是$1970-01-01\ 00:00:01$ UTC到$2038-01-19\ 03:14:07$ UTC 2. **时区敏感**:$TIMESTAMP$存储为UTC时间,检索时转换时区;$DATETIME$无时区转换 #### 二、设置默认值方法 1. **创建表时指定** ```sql CREATE TABLE example ( created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- 仅限MySQL 5.6.5+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); ``` *注意:5.6.5之前版本$DATETIME$不支持$CURRENT_TIMESTAMP$[^3]* 2. **修改现有字段** ```sql ALTER TABLE example ALTER COLUMN created_at SET DEFAULT '2023-01-01 00:00:00'; -- 静态时间 ``` 或动态设置: ```sql ALTER TABLE example MODIFY updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP; -- 需要完整列定义[^2] ``` #### 三、自动更新配置 ```sql CREATE TABLE logs ( modify_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 数据变更自动更新时间 ); ``` #### 四、常见问题解决 1. **错误1067: Invalid default value** - 检查日期格式是否符合$YYYY-MM-DD\ HH:MM:SS$规范 - 调整$sql\_mode$:移除$NO\_ZERO\_DATE$模式[^4] ```sql SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; ``` 2. **版本兼容性问题** - 5.6.5+版本允许$DATETIME$使用$CURRENT\_TIMESTAMP$ - 旧版本建议使用$TIMESTAMP$类型 #### 五、最佳实践 1. 统一使用$TIMESTAMP$记录时间戳(需注意2038年限制) 2. 重要历史时间建议用$DATETIME$存储静态时间 3. 组合使用默认值和触发器处理复杂逻辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值