Возникли проблемы с полем идентификации SQL-SERVER - PullRequest
0 голосов
/ 04 апреля 2019

Я делаю школьный проект по школьной теме, где мне нужно создать несколько таблиц для учеников, классов, программ ...

Я хочу добавить группу в определенные классы с автоматическим приращением вОднако group_id я хотел, чтобы переменная group_id сбрасывалась, если я изменял какой-либо из этих атрибутов (Classes_id, courses_acronym, year_Semesters). Как я могу сбросить его каждый раз, когда любое из этих изменений ??

Вот моя таблица:

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 голосов
/ 04 апреля 2019

где вы устанавливаете значения из?, У вас может быть сохраненный процесс, и в вашем запросе столбцы будут иметь начальное значение, установленное при нажатии на сохраненный процесс, предполагая, что в начале есть значения. Затем используйте оператор 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 на первичном ключе.Если у вас нет конкретной цели сделать это.

0 голосов
/ 04 апреля 2019

Обычно вам не нужно (нужно) сбрасывать столбец идентификаторов таблицы. Идентификационный столбец используется для создания уникальных значений для каждой отдельной записи в таблице .

Итак, вы хотите сгенерировать записи в таблице групп на основе новых записей в таблице классов. Для этой цели вы можете создать триггер в своей таблице классов.

Поскольку Group_id уже сам по себе уникален (из-за его IDENTITY), вам не нужны другие поля в первичном ключе. Вместо этого вы можете создать отдельное УНИКАЛЬНОЕ ограничение для комбинации (Classes_id, courses_acronym, year_Semesters), если вам это нужно.

И если поле id вашей таблицы классов также является столбцом IDENTITY, вы можете определить первичный ключ в вашей таблице классов только на этом поле id. И тогда ваше ограничение внешнего ключа в новой таблице групп может включать только это поле Classes_id.

Так много на данный момент. Я предполагаю, что дизайн вашей базы данных нуждается в дополнительной настройке и настройке. ;)

...