Возникли проблемы с полем идентификации SQL-СЕРВЕРА

#sql #sql-server #identity #create-table

#sql #sql-сервер #идентификация #создать таблицу

Вопрос:

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

Я хочу добавить группу к определенным классам с автоматическим увеличением в 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)
);
  

Комментарии:

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

2. Даже если все остальные атрибуты являются первичными ключами? @ZoharPeled

3. Первичный ключ не имеет ничего общего с идентификацией.

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

Ответ №1:

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

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

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

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

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

Комментарии:

1. Да, я думаю, я немного доработаю свои предыдущие таблицы, спасибо ^^

Ответ №2:

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