كيفية إنشاء قيد فريد فقط في تاريخ جزءا من التاريخ والوقت؟

StackOverflow https://stackoverflow.com/questions/620561

سؤال

وأنا أكتب محرك بلوق بسيط جدا للاستخدام الخاص (لأن كل محرك بلوق واجهت معقد جدا). أريد أن أكون قادرة على تحديد فريد لكل وظيفة من قبل URL والتي هي شيء من هذا القبيل /2009/03/05/my-blog-post-slug. لتحقيق ذلك في مستوى البيانات، أريد إنشاء قيد فريد مركب على (Date, Slug) حيث Date ليست سوى جزء التاريخ (تجاهل الوقت من اليوم) من تاريخ تكوينها. لدي بعض الأفكار نفسي (مثل عمود آخر، وربما يحسب لعقد جزء التاريخ فقط)، ولكن جئت لSO أن أعرف ما هو أفضل الممارسات في حل هذه المشكلة.

وأشك في المسائل Server الإصدار SQL هنا، ولكن للسجلات، وأنا على 2008 اكسبرس (أنا أقدر على حل أكثر المحمولة).

والجدول المخطط:

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
)

الحل المختار:

وأعتقد أن الحل مارك هو أكثر ملاءمة، معتبرا هذا السؤال هو حول 2008. ومع ذلك، سأذهب مع أسلوب صحيح (ولكن ليس مع INSERTs، كما أنه لا يضمن سلامة البيانات، وأنا سوف تستخدم precomputed عمود عدد صحيح) منذ أعتقد أنه من الأسهل للعمل مع شيء صحيح من العميل (في الاستعلام).

شكرا يا رفاق.

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
هل كانت مفيدة؟

المحلول

حسنا، في SQL Server 2008، وهناك نوع بيانات جديد يسمى "التاريخ" - هل يمكن استخدام هذا العمود وإنشاء فهرس على ذلك

.

هل يمكن بالطبع أيضا إضافة عمود محسوب من نوع "تاريخ" إلى الجدول الخاص بك ومجرد ملء جزء التاريخ من العمود DATETIME إلى أن عمود محسوب، وجعلها لا تزال قائمة، ومؤشر عليه. يجب أن تعمل على ما يرام!

وشيء من هذا القبيل:

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

CREATE UNIQUE INDEX UX_Entries ON Entries(DateOnly, Slug)

ومارك

نصائح أخرى

ومنذ كنت في عام 2008، استخدام نوع البيانات التسجيل كما يشير مارك. خلاف ذلك، وهو الحل الأسهل هو أن يكون هناك عمود غير المحسوبة (وهو ما يعني سيكون لديك لملء ذلك على INSERT) والذي يستخدم الآن في شكل YYYYMMDD. هذا هو نوع بيانات عدد صحيح وصغيرة وسهلة الاستخدام.

لSQL 2005، هل يمكن أن تفعل الشيء نفسه في الأساس على أن marc_s الموصى بها، ومجرد استخدام التاريخ والوقت القياسي. انها تبدو شيئا من هذا القبيل (رمز لم تختبر هنا):

ALTER TABLE Entries ADD
    JustTheDate AS DATEADD(day, DATEDIFF(day, 0, CompositionDate), 0) NOT NULL PERSISTED

وبعد ذلك إنشاء الفهرس الخاص بك على (JustTheDate، سبيكة)

ملاحظة: DATEADD بيان / DATEDIFF هناك تحسب فقط من تاريخ CompositionDate

.

وعلى مر السنين كان لدينا مجموعة متنوعة من المشاكل مع الأعمدة المحسوبة في SQL Server، ولذا فإننا قد توقفت عن استخدامها.

هل يمكن استخدام VIEW مع عمود للتاريخ فقط - ووضع فهرس فريد على العمود الذي نظر في

و(A ربما من المفيد الآثار الجانبية هو أنه يمكن أن يكون من جهة تستبعد بعض الصفوف - لذلك يمكن تنفيذ أشياء مثل "DateColumn يجب أن تكون فريدة من نوعها، ولكنها تستبعد WHERE IS NULL DateColumn)

ويمكن تقسيم العمود CompositionDate الموجودة في حقلين - CompositionDate وCompositionTime - واسترداد عرض أن ينضم اليهم معا مرة أخرى إذا كنت بحاجة إلى ذلك - التي من شأنها أن تسمح ثم مؤشر الأصلي على عمود تاريخ الوحيد

(وهذا يمكن تنفيذها في SQL 2005 وفي وقت سابق باستخدام التاريخ والوقت - على الرغم من الاسراف قليلا لمجرد تاريخ أو وقت، وليس على حد سواء)

وأخيرا هل يمكن أن يكون الزناد INSERT / UPDATE التي القسري التي لا سجل آخر موجود مع CompositionDate مكررة (تاريخ جزء فقط)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top