如何在删除后重用itemID

时间:2016-12-12 08:10:25

标签: c# sql sql-server

对不起英语不好,希望大家都明白并请求帮助。

我对每件商品都有独特的身份。

在程序中,它只能有200个itemID

例如,当用户创建第一个项目时,数据库会将itemID 1分配给第一个项目,itemID 2分配给第二个项目,直到itemID 200。

用户可以删除这些项目。例如,用户从itemID 1删除到itemID 20.因此,当用户创建新项目时,我想重用itemID 1,我可以知道如何处理它吗?

为了重新开始,每当用户创建新项目时,我将检查数据库中的最大项目ID,然后检索它并添加1.

mySql_ = "SELECT MAX(ITEM_ID) FROM ITEM";

Object returnValue = ExecuteSql(mySql_);

if (DBNull.Value.Equals(returnValue))
{
     ItemId += 1;
}

我的表格设计结构如下

 CREATE TABLE ITEM (
 ID NOT NULL PRIMARY KEY
 ITEMID NOT NULL
 ITEM_NAME
 )

以上将是我的表格结构。我只允许最大itemID为200.例如,用户创建了200个项目(表格将具有itemID 1到200),因此如果用户想要创建更多项目,他们将从itemID 1删除到itemID20。因此,下次用户创建项目时,插入表格的新项目将为itemID1。

3 个答案:

答案 0 :(得分:0)

如果您使用的是SQl服务器和身份。默认情况下,标识字段不会重用旧值。您可以使用DBCC CHECKIDENT重新设置它们(订单,RESEED,9) 这意味着你必须根据每个DELETE运行语句。

答案 1 :(得分:0)

自己处理ID通常不是一个好主意。让SQL Server通过标识列执行此操作。如果您的ID是orimary密钥,那么尤其在删除后不应重复使用ID。这将降低插入和索引性能。在范围的末尾添加主键值总是最有效的。

特别是查询您的MAX(ID)效率不高。如果要在不影响良好数据库设计的情况下重用ID,可以创建一个包含ID池并使用外键链接的表:

CREATE TABLE IDPool (
    ID TINYINT NOT NULL PRIMARY KEY
    --More columns if you need them
)

此表包含每个可重复使用ID的一个条目,因此在您的情况下,200个条目ID为1到200

你的项目看起来会像这样:

CREATE TABLE Items (
    ID INT NOT NULL IDENTITY PRIMARY KEY,
    PooledID TINYINT NOT NULL FOREIGN KEY REFERENCES IDPool(ID)
    --Your other columns
)

您可以插入以下新项目:

INSERT INTO Items (PooledID)
VALUES ((SELECT MIN(ID) FROM IDPool p WHERE NOT EXISTS (
    SELECT * FROM Items i WHERE p.PooledID = i.ID
)))

答案 2 :(得分:0)

我不认为你的方法很好。您应该使用身份字段,该字段始终是唯一的,并且无论如何都不会使用旧ID。但是,如果您真的想使用您的方法,请尝试在数据库中再创建一个属性。让我们说隐藏字段。

当用户删除应用程序中的记录时,您只需更新此行并将其设置为隐藏(隐藏= 1 )。

当用户创建新记录时,您再次更新此记录并将其设置为可见(隐藏= 0 )。

您可以根据此字段构建应用程序,并且可以在隐藏属性的基础上显示/隐藏/处理记录。