-1

总的来说,我是一个初学者,但我有一个理论,想法等......

我想创建一个任务数据库,使用日期具有唯一的 TaskID 列 [主键与否]。我需要自动生成条目。为了避免冲突,我想在末尾附加一个数字,所以这应该达到让所有条目唯一的目标。所以一系列条目看起来像这样:

201309281 [2013-09-28]

201309282

201309291

我的想法是我可以使用在美国东部标准时间午夜重置的自动增量,然后在给定日期重新开始,或者类似的东西。

对我来说,让它像这样工作的好处是,您可以看到在给定日期创建的所有任务,但是特定任务可能要到一周后才能完成或开具发票。这样您就可以按创建日期、完成日期或发票日期进行搜索。

我意识到有很多方法可以实现任务数据库的最终目标。我只是好奇这是否可能,或者是否有人对如何将其实现为主键列或任何其他列有任何想法。

如果这个问题不清楚,我也想道歉。我会在这里尝试总结一下。您是否可以根据创建行的日期创建一个自动增量列,因此它会自动将日期生成为数字 [20130929],并以以下格式在末尾添加一个额外的数字,并在末尾添加该额外的数字每天在东部标准时间或世界标准时间午夜重置为“1”?以及如何完成的想法?

例如:201309291

编辑:顺便说一句,我想使用 MVC4 网络应用程序为用户提供 CRUD 功能。使用 C#。我认为这个事实可能会扩大选择范围。

编辑:我在堆栈上找到了这个 q/a,它看起来很相似,但并不能完全回答我的问题。我的想法是在这里发布链接可能有助于找到答案。每天将自动增量列重置为 0

4

3 回答 3

2

我认为您是 db design Nick 的新手,但这种设计会让任何经验丰富的 DBA 畏缩不前。您应该避免将任何信息放在主键中。您可以使用类似下面的代码来获得您想要达到的结果。请记住,PK 应该始终是哑 ID,没有智能钥匙!


免责声明:我是代理键设计的坚定支持者,我对这个方向有偏见。架构没有充分考虑自然密钥设计的权衡或下游影响,我曾多次被架构刺痛。我谦虚地尊重并理解自然键倡导者的意见,但根据我开发关系业务应用程序的经验 - 代理设计在 99% 的情况下是更好的选择。


(顺便说一句,您甚至不需要 RANK 子句中的 createdt 字段,您可以在 PARTITION 的 ORDER BY 子句中使用自动增量 PK)。

CREATE TABLE tbl(
    id int IDENTITY(1,1) NOT NULL,
    dt date NOT NULL,
    createdt datetime NOT NULL

    CONSTRAINT PK_tbl PRIMARY KEY CLUSTERED (id ASC)
)
go

'I usually have this done for me by the database 
'rather than pass it from middle tier
'ALTER TABLE tbl ADD  CONSTRAINT DF_tbl_createdt  
'   DEFAULT (getdate()) FOR createdt


insert into tbl(dt,createdt) values
    ('1/1/13','1/1/13 1:00am'),('1/1/13','1/1/13 2:00am'),('1/1/13','1/1/13 3:00am'),
    ('1/2/13','1/2/13 1:00am'),('1/2/13','1/1/13 2:00am'),('1/2/13','1/1/13 3:00am')
go

SELECT id,dt,rank=RANK() OVER (PARTITION BY dt ORDER BY createdt ASC)
from tbl
于 2013-09-29T21:30:37.270 回答
0

我会说这是一个非常糟糕的设计思想。理想情况下,主键本质上应该是代理项,因此由 SQL Server 自动创建。

您起草的逻辑可能会很好地实现,但由于大量的手动工程,它可能会导致很多复杂性、维护开销和性能问题。

要创建 PK,您应该限制自己使用 IDENTITY 属性、SEQUENCES(SQL Server 2012 中的新功能)或 GUID (newID())。

即使您想采用您的设计,您也可以将日期类型列和 IDENTITY int/bigint 列结合起来。您可以添加一个额外的计算列来连接它们。每天午夜重置 IDENTITY 列不是一个好主意。

于 2013-09-30T07:15:07.893 回答
0

好的,我找到了答案。此方法可能存在我不知道的问题,因此欢迎发表评论。但这种方法确实有效。

CREATE TABLE [dbo].[MainOne](
[DocketDate] NVARCHAR(8),
[DocketNumber] NVARCHAR(10),
[CorpCode] NVARCHAR(5),
CONSTRAINT pk_Docket PRIMARY KEY (DocketDate,DocketNumber)
)
GO
INSERT INTO [dbo].[MainOne] VALUES('20131003','1','CRH')
GO
CREATE TRIGGER AutoIncrement_Trigger ON [dbo].[MainOne]
 instead OF INSERT AS
 BEGIN
 DECLARE @number INT
 SELECT @number=COUNT(*) FROM [dbo].[MainOne] WHERE [DocketDate] = CONVERT(DATE, GETDATE()) 
 INSERT INTO [dbo].[MainOne] (DocketDate,DocketNumber,CorpCode) SELECT (CONVERT(DATE, GETDATE    
 ())),(@number+1),inserted.CorpCode FROM inserted
END

有什么想法吗?在我标记为答案之前,我将等待三天。我没有标记“sisdog”的唯一原因是因为在运行插入查询时,他的回答似乎不会使其成为自动功能。

于 2013-10-04T03:00:58.670 回答