我一般都是初学者,但我有理论,想法等......
我想使用日期创建一个任务数据库,使用唯一的TaskID列[主键或不是主键]。我需要自动生成条目。为了避免冲突,我想在最后添加一个数字,所以这应该达到让所有条目都唯一的目标。所以一系列条目看起来像这样:
201309281 [2013-09-28]
201309282
201309291
我的想法是我可以使用在美国东部时间午夜重置的自动增量,并在给定日期重新开始,或类似的事情。
对我来说,让它像这样工作的优势在于,您可以看到在给定的一天创建的所有任务,但是特定任务可能无法完成或开具发票,直到一周之后。这样,您可以按创建日期,完成日期或发票日期进行搜索。
我意识到有很多方法可以实现任务数据库的最终目标。我只是好奇这是否可能,或者是否有人对如何将其作为主键列或任何其他专栏实现有任何想法。
如果这个问题不清楚,我也想道歉。我会在这里总结一下。 您是否可以根据创建行的日期创建自动增量列,因此它会自动生成日期为数字[20130929],末尾有一个额外的数字,格式如下,并且末尾有一个额外的数字编号美国东部时间或UTC时间每天重置为“1”? 关于如何完成的想法?例如: 201309291
编辑:BTW,我想使用MVC4网络应用程序为用户提供CRUD功能。使用C#。我认为这个事实可能会扩大选择范围。 编辑:我在堆栈上发现了这个q / a,看起来很相似,但并没有完全回答我的问题。我的想法是在这里发布链接可能有助于找到答案。 Resetting auto-increment column back to 0 daily答案 0 :(得分: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
答案 1 :(得分:0)
我会说这是一个非常糟糕的设计思想。理想情况下,主键本质上应该是代理,因此由SQL Server自动创建。
您起草的逻辑可能会得到很好的实施,但由于大量的手工工程,它可能会导致很多复杂性,维护开销和性能问题。
要创建PK,您应该将自己限制为IDENTITY属性,SEQUENCES(SQL Server 2012中的新增功能)或GUID(newID())。
即使您想要使用您的设计,您也可以使用Date type列和IDENTITY int / bigint列的组合。并且您可以添加额外的计算列来连接它们。每隔午夜重置IDENTITY列不是一个好主意。
答案 2 :(得分: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'的唯一原因是因为在运行插入查询时,他的答案似乎不会使它成为自动函数。