sql-server - SSMS 检查约束不允许使用有效数据更新表
问题描述
我在脚本表中的表设计中有以下内容...创建到...SSMS的新查询窗口:
CREATE TABLE [DirectMarketing].[Opportunity](
[OpportunityID] [int] NOT NULL,
[ProspectID] [int] NOT NULL,
[DateRaised] [date] NOT NULL,
[Likelihood] [tinyint] NOT NULL,
[Rating] [char](1) NOT NULL,
[EstimatedClosingDate] [date] NOT NULL,
[EstimatedRevenue] [decimal](10, 2) NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO
ALTER TABLE [DirectMarketing].[Opportunity] ADD CONSTRAINT [DF_Opportunity_DateRaised] DEFAULT (getdate()) FOR [DateRaised]
GO
ALTER TABLE [DirectMarketing].[Opportunity] WITH NOCHECK ADD CONSTRAINT [CK_Opportunity] CHECK (([DateRaised]=getdate()))
GO
ALTER TABLE [DirectMarketing].[Opportunity] CHECK CONSTRAINT [CK_Opportunity]
GO
但是当我尝试通过在表中输入数据来测试它时,我不断收到一个错误,说没有更新行。请参阅下图了解输入的数据和随后的错误。我做错了什么?
解决方案
该表达式[DateRaised]=GETDATE()
正在比较date
和的类型datetime
。由于datetime
具有更高的优先级,日期值将转换为具有午夜时间的日期时间。由于非午夜时间,比较然后返回 false。
解决方案是添加一个CAST
:
ALTER TABLE [DirectMarketing].[Opportunity]
ADD CONSTRAINT [CK_Opportunity] CHECK ([DateRaised]=CAST(getdate() AS date));
推荐阅读
- php - 通过 PHP 访问公司授权后的 SharePoint 文件
- azure - 使用 Azure AD B2C 用户流的“自定义页面内容”时,是否应该选择“页面布局版本”?
- html - 我试图让文本出现在图像的右侧,并且让实际的图像框比目前的更苗条
- android - 试图让一组文本视图保存在共享首选项中
- c - scanf() 在 for 循环中只运行一次
- android - Flutter 中的参数无效
- mysql - 在mysql中为group by语句选择不同的参数?
- reactjs - 如何防止组件过早消失?
- kotlin - 类型不匹配 Kotlin 和 getStringArrayListExtra
- javascript - Webpack - 多个入口点,需要它们之间的捆绑包