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

Откуда:
Сообщений: 1
Товарищи, подскажите возможна ли в sql server проверка по двум и более столбцам, при добавлении данных в таблицу!?...

допустим, есть 2 таблицы:

(табл 1)
id|| country|| city
1|| Россия|| Москва
2|| Россия|| Самара
3|| Италия || Рим

(табл 2)
name ||city||id (fk_1)
Иван ||Москва ||NULL /* 1 - верно, 2/3 -нет*/
Сергей ||Рим ||NULL /*3 - верно, 1/2 - нет*/
Ольга ||Сочи ||NULL /*1,2,3 - не верно*/

в (табл 1) столбец "ID" это PRIMARY KEY, а в (табл 2) столбец "ID(fk_1)" это FOREIGN KEY. Соответственно, из этого примера, в "id (fk_1)" можно будет только добавить цифры 1,2 или 3 (из столбца ID, таблица 1 ). Но ведь ошибочно можно подставить 3 в первую стоку столбца "id (fk_1)" (табл 2), хотя 3 - это Рим в (табл 1)

Поэтому подскажите можно ли что бы при вводе данных в (табл 2) FOREIGN KEY проверял не только данные из столбца "ID", но и названия городов. Если в (табл 2) city = 'Москва', то в столбец "id (fk_1)" можно ввести только 1, если city = 'Рим', то только 3!?
16 янв 18, 18:58    [21111846]     Ответить | Цитировать Сообщить модератору
 Re: проверка по двум и более столбцам при вводе данных в таблицу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31371
Андрей2707
Поэтому подскажите можно ли что бы при вводе данных в (табл 2) FOREIGN KEY проверял не только данные из столбца "ID", но и названия городов
Да, возможно. Просто делаете FK по 2 столбцам.

Хотя так не делают, это нарушение какой-то-там нормальной формы.
Если у вас в одной таблице названия городов и их ID, то в других таблицах указывают только ID, без названий.
16 янв 18, 19:04    [21111867]     Ответить | Цитировать Сообщить модератору
 Re: проверка по двум и более столбцам при вводе данных в таблицу  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Андрей2707,
ALTER TABLE dbo.Table2
ADD CONSTRAINT FK_id (fk_1)_City
FOREIGN KEY(id (fk_1), City)
REFERENCES dbo.Table1(id, City)
16 янв 18, 19:05    [21111873]     Ответить | Цитировать Сообщить модератору
 Re: проверка по двум и более столбцам при вводе данных в таблицу  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36989
Через foreign key -- нет. Ну и зачем нужно перманентное поле id во второй таблице, тоже не ясно.
16 янв 18, 19:06    [21111874]     Ответить | Цитировать Сообщить модератору
 Re: проверка по двум и более столбцам при вводе данных в таблицу  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36989
alexeyvg
Да, возможно. Просто делаете FK по 2 столбцам.
FK по двум полям не позволит держать запись Москва + NULL во второй таблице.
16 янв 18, 19:07    [21111878]     Ответить | Цитировать Сообщить модератору
 Re: проверка по двум и более столбцам при вводе данных в таблицу  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Гавриленко Сергей Алексеевич
alexeyvg
Да, возможно. Просто делаете FK по 2 столбцам.
FK по двум полям не позволит держать запись Москва + NULL во второй таблице.

наоборот позволит, проверка не срабатывает
16 янв 18, 19:14    [21111901]     Ответить | Цитировать Сообщить модератору
 Re: проверка по двум и более столбцам при вводе данных в таблицу  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36989
TaPaK
Гавриленко Сергей Алексеевич
пропущено...
FK по двум полям не позволит держать запись Москва + NULL во второй таблице.

наоборот позволит, проверка не срабатывает
Как выяснилось, да, позволит. В случае, если хотя бы одно из полей составного FK равно null, ничего не проверяется, т.е. можно в другие поля писать вообще все, что угодно. (Хотя есть маразматичный вариант делать дополнительно fk на каждое поле).

Сообщение было отредактировано: 16 янв 18, 19:34
16 янв 18, 19:28    [21111920]     Ответить | Цитировать Сообщить модератору
 Re: проверка по двум и более столбцам при вводе данных в таблицу  [new]
msLex
Member

Откуда:
Сообщений: 8093
Гавриленко Сергей Алексеевич
TaPaK
пропущено...

наоборот позволит, проверка не срабатывает
Как выяснилось, да. В случае, если хотя бы одно из полей составного FK равно null, ничего не проверяется, т.е. можно в другие поля писать вообще все, что угодно. Хотя есть маразматичный вариант делать дополнительно fk на каждое поле.


Возвращаясь к недавней теме троичной логики 21107702, FK при проверке ведут себя так же, как и check constrint, трактуя unknown как допустимый результат.
16 янв 18, 19:34    [21111931]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить