Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Добрый самаритянин
 Аватар для John_Pa9JIbHuK
1107 / 622 / 139
Регистрация: 31.03.2009
Сообщений: 2,567

Подзапросы в ограничителе CHECK

02.02.2011, 15:50. Показов 2654. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Столкнулся с такой проблемой:

Допустим есть Таблица Студенты, Факультеты, Специальности.

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

Решил сделать при помощи дополнительной таблицы(по сути дела так и надо так как факультеты пополняются, ну следовательно и специальности принадлежащие им), она выглядит следующим образзом:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE Связь
(
    ID INT PRIMARY KEY IDENTITY(1, 1),
    ID_F INT, --ID факультета для внешнего ключа
    ID_S INT, --ID спец-ти для внешнего ключа
 
--тут собственно сами внешние ключи, где мы ID_F  связываем с первичным ключиком таблицы 
                 --факультеты,  ID_S  с первичным ключиком таблицы Специальности
 
    CONSTRAINT FK_F FOREIGN KEY(ID_F)
    REFERENCES Факультеты(ID_Факультета),
    CONSTRAINT FK_S FOREIGN KEY(ID_S)
    REFERENCES Специальности(ID_Специальности)    
)
Таблица Специальности
SQL
1
2
3
4
5
6
CREATE TABLE Специальности
(
    ID_Специальности INT PRIMARY KEY IDENTITY(1, 1),
    Наименование VARCHAR(30) NOT NULL UNIQUE,
    Куратор VARCHAR(30) NOT NULL
)
Таблица Факультеты
SQL
1
2
3
4
5
6
7
CREATE TABLE Факультеты
(
    ID_Факультета INT PRIMARY KEY IDENTITY(1, 1),
    Наименование VARCHAR(30) NOT NULL,
    Декан VARCHAR(30) NOT NULL,
    Телефон VARCHAR(30) NOT NULL
)
Теперь все внимание сюда:

Пытаюсь сделать ограничение:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE Студенты
(
    ID_Студента INT PRIMARY KEY IDENTITY(1, 1),
    Фамилия VARCHAR(30) NOT NULL,
    Имя VARCHAR(30) NOT NULL,
    Отчество VARCHAR(30) NOT NULL,
    ID_Ф INT,
    ID_С INT,
    CONSTRAINT FK_ST_F FOREIGN KEY(ID_Ф)
    REFERENCES Факультеты(ID_Факультета),     
    CONSTRAINT FK_ST_S FOREIGN KEY(ID_С)
    REFERENCES Специальности(ID_Специальности),
    CONSTRAINT FK_INS CHECK(ID_С = (SELECT ID_S FROM Связь WHERE ID_F = ID_Ф))
)
Ошибка в этой строчке
CONSTRAINT FK_INS CHECK(ID_С = (SELECT ID_S FROM Связь WHERE ID_F = ID_Ф))

Я пытаюсь введенный ID НАЙТИ в списке специальностей данного факультета
то есть если ID_С у нас есть в запросе всех специальностей данного факультета то разрешить добавление.

Добавлено через 2 минуты
Как обойти это дело если в ограничении нельзя использовать подзапросы
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.02.2011, 15:50
Ответы с готовыми решениями:

Подзапросы
Здравствуйте! Подскажите, пожалуйста, как мне посчитать сумму товара (Quantity), которая выводится с помощью подзапроса и...

Вложенные подзапросы
Довольно сложный для понимания(моего) запрос. Помогите пожалуйста. есть таблица EXAM_MARKS c полями STUDENT_ID SUBJ_ID MARK ...

Подзапросы в joinax
Расскажите плз про них и приведите пример адекватного использования таковых.

4
 Аватар для Humanitis
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
02.02.2011, 16:35
SQL
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE Студенты
(
        ID_Студента INT PRIMARY KEY IDENTITY(1, 1),
        Фамилия VARCHAR(30) NOT NULL,
        Имя VARCHAR(30) NOT NULL,
        Отчество VARCHAR(30) NOT NULL,
    ID_Ф INT,
    ID_С INT,
        CONSTRAINT FK_INS  FOREIGN KEY(ID_Ф,ID_С)
        REFERENCES Связь (ID_F,ID_S )
)
или триггером
1
Добрый самаритянин
 Аватар для John_Pa9JIbHuK
1107 / 622 / 139
Регистрация: 31.03.2009
Сообщений: 2,567
02.02.2011, 16:45  [ТС]
Цитата Сообщение от Humanitis Посмотреть сообщение
CREATE TABLE Студенты
(
* * * * ID_Студента int PRIMARY KEY identity(1, 1),
* * * * Фамилия varchar(30) NOT NULL,
* * * * Имя varchar(30) NOT NULL,
* * * * Отчество varchar(30) NOT NULL,
* * ID_Ф int,
* * ID_С int,
* * * * CONSTRAINT FK_INS *FOREIGN KEY(ID_Ф,ID_С)
* * * * REFERENCES Связь (ID_F,ID_S )
)
Можешь объяснить что ты этим сделал?

Добавлено через 2 минуты
Humanitis, Связь (ID_F,ID_S ) эти поля то не первичные

Добавлено через 50 секунд
Так получается подзапросы в ограничении не разрешены?
0
 Аватар для Humanitis
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
03.02.2011, 10:27
Цитата Сообщение от John_Pa9JIbHuK Посмотреть сообщение
Humanitis, Связь (ID_F,ID_S ) эти поля то не первичные
А должны быть первичными в этой таблице, так как не может такая связка(ID_F,ID_S ) повторяться
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
04.02.2011, 15:39
Цитата Сообщение от John_Pa9JIbHuK Посмотреть сообщение
Так получается подзапросы в ограничении не разрешены?
Зато разрешены скалярные функции, внутри которых можно выполнить запрос и вернуть некий признак, который и проверять в CONSTRAINT CHECK()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.02.2011, 15:39
Помогаю со студенческими работами здесь

вложенные подзапросы
Здравствуйте.Объяснити немножко приоритеты выполнения подзапросов в sql запросах Например у меня есть запрос:нахожу суммарную зарплату по...

Запросы и подзапросы
Доброго времени суток, возникла задача такого рода: Есть две таблицы People и Orders, они имеют структуру, показанную во вложениях. ...

Подзапросы, скалярные выражения
Доброго времени суток всем! Вот написал процедуру на sql и он мне выдал ошибку: Subqueries are not allowed in this context. Only scalar...

Подзапросы на отбор записей
Всем доброго времени суток! Прошу помощи с написанием запроса на выборку данных по условиям. Застопорилась и не понимаю куда дальше...

Порядок разработки сложных запросов включающих вложенные подзапросы
Раскрыть порядок разработки сложных запросов включающих вложенные подзапросы


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru