2015-05-23 34 views
1

我有一個「旅行」表日期列(旅行日期),但我不需要重複旅行的一天,所以我想知道如果我可以做一個獨特的約束在日期的一部分使用SQL Server 2014年 我創建這個表如何在不考慮年份的情況下對日期類型列創建UNIQUE約束?

CREATE TABLE trips 
    (
     ID int IDENTITY(1,1) PRIMARY KEY not null , 
     day_of_trip date not null, 
     time_of_trip time not null, 
     cost money not null, 
     passengers int not null, 
     bus_id int not null, 
     trans_comp_id int not null, 
     route_id int not null, 
     CONSTRAINT UK_time UNIQUE (day_of_trip,time_of_trip,bus_id), 
     FOREIGN KEY (bus_id) REFERENCES bus(id), 
     FOREIGN KEY (trans_comp_id) REFERENCES trans_comp(id), 
     FOREIGN KEY (route_id) REFERENCES routes_(id) 
     ) 

但就像 第一次在day_of_trip插入數據時:2015年1月2日 第二次:2015年5月8日

它給因錯誤

Msg 2627, Level 14, State 1, Line 7 
Violation of UNIQUE KEY constraint 'UK_time'. Cannot insert duplicate key in object 'dbo.trips'. The duplicate key value is (2015-01-02, 06:20:00.0000000, 2). 

我想在2015年有不止一次的旅行,但不在2015年2月15日。

+0

請編輯與有效和無效日期的例子來支持你的問題。 –

+0

是編輯有用嗎? @GordonLinoff – user3159060

+0

你的約束應該做你想做的。它看起來像你的第二次插入是'2015-01-02',而不是'2015-05-08'。 –

回答

1

「我想知道是否可以使用sql server 2014對日期的一部分進行約束。」

我假設你的意思是「唯一的約束」給予標題。如果這是你的問題,那麼答案是「是」。您通過創建計算列來完成此操作,然後在這些列上構建唯一索引。

這裏有一種方法:

alter table <table> add mmdd as (month(date)*100 + day(date)); 
create unique index idx_table_mmdd on <table>(mmdd); 
+0

哦,是的,我的意思是獨一無二的,我編輯了這個問題。你能告訴我什麼是* 100使用? – user3159060

+0

@ user3159060。 。 。這只是以mmdd的形式產生一列作爲數字。看起來很方便,可以在月和日期間演示一個獨特的限制。 –

相關問題