遇到SQL-SERVER的Identity字段的问题

时间:2019-04-04 09:54:52

标签: sql sql-server identity create-table

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

我想将Group添加到已确定的类中,并且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)
);

2 个答案:

答案 0 :(得分:0)

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

因此,您想基于班级表中的新条目在组表中生成条目。为此,您可以在类表上创建一个触发器

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

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

现在太多了。我想您的数据库设计需要更多的其他调整和调整。 ;)

答案 1 :(得分:0)

您在哪里设置值?,您可以有一个存储的proc,并且在您的查询中,当命中存储的proc时,假设列开头有值,则列中设置的初始值将 然后使用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

NB:建议在主键上使用int。除非您有特定的目的。