那些我们想当然的错误[SQL]
无论在学习生活中,我们都会经历一些所谓“想当然”的错误,本来应该这样的,结果呢,事实上不一样。
今天介绍一个挺二的错误,也属于想当然的错误:在表news中,NewsAddTime字段使用了SQL内置函数getdate(),在插入表数据时,犯了这个想当然的错误。
且听我细细道来:
1、先上一下表结构:
CREATE TABLE [News] ( NewsID int PRIMARY KEY IDENTITY (1,1), UserID int REFERENCES[Users](UserID), NewsClassID int REFERENCES [NewsClass](NewsClassID)NOT NULL, NewsTitle nvarchar(128) NOT NULL, NewsDescription nvarchar(128) NULL, NewsReadCount int NOT NULL DEFAULT '0', NewsAddTime datetime DEFAULT getdate() NOT NULL,--使用了getdate()函数。 NewsContents nvarchar(max) NULL, NewsPictureUri nvarchar(max) NULL, NewsKeyWords nvarchar(128) NULL , )
2、在使用Insert into 语句插入数据时:
错误代码
INSERT INTO [jwyweb].[dbo].[News] ([UserID] ,[NewsClassID] ,[NewsTitle] ,[NewsDescription] ,[NewsReadCount] ,[NewsAddTime] ,[NewsContents] ,[NewsPictureUri] ,[NewsKeyWords]) VALUES ('1' ,'7' ,'喜讯-我司喜获“闵行区工人发明家”等荣誉' ,'2012年4月29日,我公司XXX同志,荣获“工人发明家”二等奖。' ,'1' ,'' ,'2012年4月29日,我公司XXX同志,荣获“XXX工人发明家”二等奖。' ,'' ,'喜讯')
在插入NewsAddTime时,当时就想该字段既然使用了默认函数返回当前时间,那么给他个空值吧【想当然了】,结果过我查询了News表返回的结果:【有点无厘头】
咦?咦?咦?咦?
怎么搞来了个1900-01-01 00:00:00.000顿时不得其解。各种查资料:
结果:SQL若字段定义的类型为datetime,插入为''(空),那么会默认值为1900-01-01 00:00:00.000
解决:
select getdate() as currenttime select * from news select cast('' as datetime),cast(nullif('','') as datetime) ,isnull(cast(nullif('','') as datetime),getdate())
我不死心呐,结果有了这么一条语句:
去掉NewsAddTime列
INSERT INTO [jwyweb].[dbo].[News] ([UserID] ,[NewsClassID] ,[NewsTitle] ,[NewsDescription] ,[NewsReadCount] ] ,[NewsContents] ,[NewsPictureUri] ,[NewsKeyWords]) VALUES ('1' ,'7' ,'喜讯-我司喜获“闵行区工人发明家”等荣誉' ,'2012年4月29日,我公司XXX同志,荣获“工人发明家”二等奖。' ,'1' ,'2012年4月29日,我公司XXX同志,荣获“XXX工人发明家”二等奖。' ,'' ,'喜讯')
查询结果:【正常了,o yeah】
这样不能算完了,继续学习
找到了一个前辈写的此情况问题
请移步—————————————详解
【待续】
本文版权归本人和博客园共同所用,转载请注明出处。