对不起英语不好,希望大家都明白并请求帮助。
我对每件商品都有独特的身份。
在程序中,它只能有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。
答案 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 )。
您可以根据此字段构建应用程序,并且可以在隐藏属性的基础上显示/隐藏/处理记录。