用唯一id规范数据库的数据库设计';s来建立一个数字
本文关键字:数据库 建立 一个 数字 id 唯一 | 更新日期: 2023-09-27 18:28:28
大问题-我有一个10位数长的学号,它来自三个不同的数据库表。例如,学生编号为0012011234,对应值为:
0012 = school id
01 = class id
1234 = student id
有人能告诉我如何将这个数据库设置为自动递增并建立这些学生人数吗?现在我有三个不同的数据库表(学校、教室、学生),显然它们都需要是唯一的。我在C#工作,很难弄清楚如何自动增加教室&学生与学校息息相关。有什么帮助吗?
您不能(也不应该)为此使用自动增量。这应该通过添加学生的应用程序来完成。如果有多个应用程序可以添加学生,请将该逻辑放入应用程序可以共享的单独库(或web服务)中。
这通常被称为"智能标识符",而不是自动增量的设计目的。
要在应用程序中做到这一点,我只需要在添加新记录时查询每个表,并为每个组(学校或班级)选择id
作为max(id) + 1
。
我认为您的基本模型有缺陷。
学生可以参加多个班级,也可能参加多所学校。学校共享设施也很常见,这样一个班级就可以有来自多所学校的学生。
您应该为学生、学校和班级分别运行一系列id,然后添加两个关系表school_x_class
和student_x_class
。
这应该涵盖所有可能发生的情况。
虽然这不是一个像D Stanley所说的好方法,但我想说,你可以写一个标量值函数,它从这些表中获取顶部值,并组合形成你想要的值
CREATE FUNCTION GetNewID
(
)
RETURNS NVarChar(15)
AS
BEGIN
-- Declare the return variable here
DECLARE @result NVarChar(15)
DECLARE @SchoolId int
,@ClassId int
,@StudentId int
SELECT TOP 1 @SchoolId=ID FROM SchoolTable
SELECT TOP 1 @StudentId=ID FROM StudentTable
SELECT TOP 1 @ClassId=ID FROM ClassTable
SET @RESULT = CONVERT(NVARCHAR,(@SchoolId+1)) + CONVERT(NVARCHAR,(@ClassId+1)) + CONVERT(NVARCHAR,(@StudentId+1))
-- Return the result of the function
RETURN @result
然后使用此函数dbo.GetNewID()
获取最新的ID