遇到SQL-SERVER的Identity字段问题

问题描述 投票:0回答:2

我正在做一个关于学校主题的学校项目,我需要为学生,班级,课程创建一些表...

我想在group_id中添加一个具有自动增量的确定类的组但是如果我更改任何这些属性(Classes_id,courses_acronym,year_Semesters)我想要重置group_id变量如何在每次更改时重置它?

这是我的表:

CREATE TABLE Classes_Groups(
    Classes_id varchar(2),
    Group_id INT IDENTITY(1,1),
    courses_acronym varchar(4),
    year_Semesters varchar(5),
    FOREIGN KEY (Classes_id, year_Semesters,courses_acronym) REFERENCES Classes(id,year_Semesters, courses_acronym),
    PRIMARY KEY(Classes_id,courses_acronym,year_Semesters,Group_id)
);
sql sql-server identity create-table
2个回答
0
投票

通常,您不需要(需要)重置表的标识列。标识列用于为表中的每个记录创建唯一值。

因此,您希望根据类表中的新条目在组表中生成条目。您可以为此目的在类表上创建一个触发器。

由于Group_id本身已经是唯一的(因为它的IDENTITY),因此根本不需要主键中的其他字段。相反,如果需要,可以为组合(Classes_id, courses_acronym, year_Semesters)创建单独的UNIQUE约束。

如果类表的id字段也是IDENTITY列,则可以仅在该id字段中在类表中定义主键。然后,您的新组表中的外键约束只能包含该Classes_id字段。)

现在这么多。我想你的数据库设计需要一些额外的调整和调整。 ;)


0
投票

你在哪里设置值?,你可以有一个存储过程,并且在你的查询中,当存储过程被命中时,假定在开头有值,则列具有初始值。然后使用IF语句。声明@initial_Classes_id varchar(2)= - 插入初始值声明@initial_courses_acronym varchar(4)= - 插入初始值声明@initial_year_Semesters varchar(5)= - 插入初始值

            declare @compare_Classes_id varchar(2) =  (select top 1 Classes_id from Classes_Groups order by --PK column desc for last insert); l would add Dateadded and then order with last insert date
            declare @compare_courses_acronym varchar(2) =  (select top 1 Classes_id from Classes_Groups where Classes_id = @compare_Classes_id); 
            declare @compare_year_Semesters varchar(2) =  (select top 1 Classes_id from Classes_Groups where Classes_id = @compare_Classes_id); 


            IF (@initial_Classes_id != @compare_Classes_id OR @initial_courses_acronym != @compare_courses_acronym OR @initial_year_Semesters != @compare_year_Semesters)
            BEGIN

            DBCC CHECKIDENT ('Group_id', RESEED, 1)
            Insert into Classes_Groups (courses_acronym,year_Semesters)
            values (
            courses_acronym,
            year_Semesters
            )

            END

            ELSE 

            BEGIN
            Insert into Classes_Groups (courses_acronym,year_Semesters)
            values (
            courses_acronym,
            year_Semesters
            )
            END

注意:建议在主键上使用int。除非你有特定的目的。

© www.soinside.com 2019 - 2024. All rights reserved.