Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Что я делаю не так?  [new]
sadisttttt
Member

Откуда:
Сообщений: 4
Добрый день,

Только-только начал обучение sql и сразу же появились проблемы, прощу помощи

Хочу, чтобы в таблице Student, в поле university можно было вводить только те данные, которые есть в поле university из таблицы University
Замечание: хочу научится именно через код, а не графический редактор

create table Student
(
	id int identity(1,1) not null,
	name varchar(15) not null,
	surname varchar(15) not null,
	university varchar(30) not null
)

alter table Student
add constraint PrimaryKeyStudent primary key clustered (university)
go


create table University
(
	university varchar(30) not null,
	about_univesity varchar(max) not null
)

alter table University
add constraint PrimaryKeyUniversity primary key clustered (university)
go

alter table University
with check add constraint FowardKeyUniversityStudent foreign key (university)
references Student(university)
on update cascade
on delete cascade
go
20 мар 17, 21:12    [20315620]     Ответить | Цитировать Сообщить модератору
 Re: Что я делаю не так?  [new]
Добрый Э - Эх
Guest
sadisttttt,

внешний ключ не в ту таблицу пихаешь... так-то студенты должны ссылаться на университеты, а не наоборот...
20 мар 17, 21:47    [20315704]     Ответить | Цитировать Сообщить модератору
 Re: Что я делаю не так?  [new]
Добрый Э - Эх
Guest
sadisttttt,

и в целом - у тебя каждый из студентов будет учится в собственном уникальном ВУЗе?
20 мар 17, 21:49    [20315707]     Ответить | Цитировать Сообщить модератору
 Re: Что я делаю не так?  [new]
sadisttttt
Member

Откуда:
Сообщений: 4
Да нет, просто перечислить некоторые университеты хочу, а потом, когда вводил бы студента, чтобы можно было бы только те университеты вводить, которые в той таблице

А как правильно, если не трудно, покажи
20 мар 17, 22:47    [20315793]     Ответить | Цитировать Сообщить модератору
 Re: Что я делаю не так?  [new]
pima
Member

Откуда: Москва
Сообщений: 496
sadisttttt,
для каждой записи в дочерней таблице (Student) принято не прописывать университет заново со всей подноготной, а давать на него ссылку в виде идентификатора. В таблице University добавляем еще одно поле ID (int) и делаем его первичным ключом. Первичный ключ на поле varchar - плохая практика, т.к. резко возрастает размер индексов (varchar занимает много места в отличие от int). А в таблице Student вместо university varchar(30) делаем поле univercityID (int), указывающее на id-шник университета. Первичный ключ должен быть уникален в пределах таблицы!!! соответственно
add constraint PrimaryKeyStudent primary key clustered (university)

не прокатит, т.к. univercity - здесь не уникальное поле, откуда и взялся вопрос "у вас каждый студент будет учиться в своем персональном вузе?" :))

Надо примерно так:
create table Student
(
	id int identity(1,1) not null,
	name varchar(15) not null,
	surname varchar(15) not null,
	universityID int not null
)

alter table Student
add constraint PrimaryKeyStudent primary key clustered (id) -- !! id делаем первичным ключом, а не university varchar(30)
go


create table University
(
        id int identity(1,1) not null, -- !! добавляем целочисленный первичный ключ
	university varchar(30) not null,
	about_univesity varchar(max) not null
)

alter table University
add constraint PrimaryKeyUniversity primary key clustered (id)

alter table Student /*!!! а не University*/ with check add constraint ForeignKeyUniversityStudent foreign key (universityID) references University(ID) /* а не на таблицу Student */
21 мар 17, 08:45    [20316132]     Ответить | Цитировать Сообщить модератору
 Re: Что я делаю не так?  [new]
pima
Member

Откуда: Москва
Сообщений: 496
И с опциями on update cascade, on delete cascade поаккуратней. Обычно они не применяются, т.к. очень опасно. Можно так вырезать полбазы случайно. Если чьи-то кривые ручки захотят по ошибке удалить университет, в котором есть студенты, - как вы это предотвратите? Если стоит on delete cascade, то никак, он просто грохнется и все, потом восстанавливать базу. Если cascade не стоит - вылезет ошибка (контроль по внешнему ключу), мол на этот университет университет ссылаются студенты, невозможно удалить. Действие должно быть осознанным, т.е. хочешь удалить универ - пожалуйста, если он пустой, удалится без вопросов. А если не пустой - осознай что делаешь, зайди в справочник студентов и всех поотчисляй, потом можешь удалять универ.
Соответственно и on update cascade здесь не нужен, т.к. если делать по уму - идентификаторы int практически никогда не апдейтятся, в ооочень исключительных случаях какой-нибудь перезаливки/трансформации данных, которая все равно делается вами вручную, ну и проапдейтите вручную айдишники если уж припрет. Но вряд ли понадобится.
21 мар 17, 08:50    [20316142]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить