#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 для первичного ключа. Если у вас нет конкретной цели для этого.