当前位置:  开发笔记 > 数据库 > 正文

如何在日期时间的日期部分创建唯一约束?

如何解决《如何在日期时间的日期部分创建唯一约束?》经验,为你挑选了1个好方法。

我正在编写一个非常简单的博客引擎供自己使用(因为我遇到的每个博客引擎都太复杂了).我希望能够通过其URL来唯一地标识每个帖子/2009/03/05/my-blog-post-slug.要在数据层中完成它,我想创建一个复合唯一约束,(Date, Slug)其中Date只有组成日期的日期部分(忽略一天中的时间).我自己有一些想法(比如另一个专栏,可能只是计算,只保留日期部分),但我来了解SO以解决这个问题的最佳实践.

我怀疑SQL Server版本在这里很重要,但是对于记录,我是2008 Express(我很欣赏更便携的解决方案).

表模式:

create table Entries (
    Identifier int not null identity,
    CompositionDate datetime not null default getdate(),
    Slug varchar(128) not null default '',
    Title nvarchar(max) not null default '',
    ShortBody nvarchar(max) not null default '',
    Body nvarchar(max) not null default '',
    FeedbackState tinyint not null default 0,
    constraint pk_Entries primary key(Identifier),

    constraint uk_Entries unique (Date, Slug) -- the subject of the question
)

选择解决方案

我认为marc的解决方案更合适,考虑到这个问题是关于2008年的.但是,我将使用整数方法(但不是INSERTs,因为它不能确保数据的完整性;我将使用预先计算的整数列)因为我认为从客户端(在查询中)处理整数事物更容易.

感谢你们.

create table Entries (
    Identifier int not null identity,
    CompositionDate smalldatetime not null default getdate(),
    CompositionDateStamp as cast(year(CompositionDate) * 10000 + month(CompositionDate) * 100 + day(CompositionDate) as int) persisted,
    Slug varchar(128) not null default '',
    Title nvarchar(max) not null default '',
    ShortBody nvarchar(max) not null default '',
    Body nvarchar(max) not null default '',
    FeedbackState tinyint not null default 0,
    constraint pk_Entries primary key(Identifier),
    constraint uk_Entries unique (CompositionDateStamp, Slug)
)
go

marc_s.. 13

好吧,在SQL Server 2008中,有一个名为"DATE"的新数据类型 - 您可以使用该列并在其上创建索引.

您当然也可以在表中添加"DATE"类型的计算列,只需将DATETIME列的日期部分填充到该计算列中,使其成为PERSISTED并对其进行索引.应该工作得很好!

像这样的东西:

ALTER TABLE dbo.Entries
   ADD DateOnly as CAST(CompositionDate AS DATE) PERSISTED

CREATE UNIQUE INDEX UX_Entries ON Entries(DateOnly, Slug)



1> marc_s..:

好吧,在SQL Server 2008中,有一个名为"DATE"的新数据类型 - 您可以使用该列并在其上创建索引.

您当然也可以在表中添加"DATE"类型的计算列,只需将DATETIME列的日期部分填充到该计算列中,使其成为PERSISTED并对其进行索引.应该工作得很好!

像这样的东西:

ALTER TABLE dbo.Entries
   ADD DateOnly as CAST(CompositionDate AS DATE) PERSISTED

CREATE UNIQUE INDEX UX_Entries ON Entries(DateOnly, Slug)

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有