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

Откуда:
Сообщений: 4
Есть БД:
1 таблица:
Users
---------
UserID
NameID
...
2 таблица:
Names
---------
NameID
Name

Вопрос: как при добавлении информации о пользователе обеспечить уникальность полей в связанной таблице (Names)?
Проще говоря, нужно, чтобы в таблице Names не было одинаковых имён. Для этого при добавлении нужно как-то проверять наличие вставляемого имени в таблице Names.
Это можно сделать средствами сервера (MSSQL 2008 express) или нужно делать 1 дополнительный запрос из клиента? Если первое, то, пожалуйста, без триггеров и хранимых процедур.
вопрос скорее всего нубский, но беглый поиск по форуму ничего не дал.
22 июн 11, 07:59    [10851335]     Ответить | Цитировать Сообщить модератору
 Re: Поддержание уникальности полей связанной таблицы  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
deprecated,

CREATE TABLE .... CONSTRAINT ... UNIQUE
Только уникальные имена - это прочная практика. Попадаются полные однофамильцы, одноименцы, однорожденцы...
22 июн 11, 08:09    [10851356]     Ответить | Цитировать Сообщить модератору
 Re: Поддержание уникальности полей связанной таблицы  [new]
deprecated
Member

Откуда:
Сообщений: 4
Guf,

то, что попадаются однофамильцы и прочее, неважно. пользователя всё равно не по этой информации идентифицировать.
постараюсь изложить ещё проще:
если в таблице Names будут следующие данные:
NameID Name
1 Василий
2 Алексей
то при добавлении в таблицу Users пользователей с именами Василий или Алексей в Users.NameID подставлялся Names.NameID (1 или 2)
а если добавляется инфа о пользователе с именем, например, Сергей, то Сергей вставляется в Names, и уже его NameID подставляется в Users.NameID
может быть так понятнее.
22 июн 11, 08:20    [10851375]     Ответить | Цитировать Сообщить модератору
 Re: Поддержание уникальности полей связанной таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
declare @u table (usr_id int primary key, name_id int not null)
declare @n table (name_id int identity primary key, name varchar(50) unique)

insert into @n
 (name)
values
 ('Вася')

merge @n t
using
 (select 'Вася' as name) as s on s.name = t.name
when not matched then
 insert (name) values (s.name)
when matched then
 update
  set name = s.name
output 1, inserted.name_id into @u (usr_id, name_id);

select * from @n
select * from @u

merge @n t
using
 (select 'Петя' as name) as s on s.name = t.name
when not matched then
 insert (name) values (s.name)
when matched then
 update
  set name = s.name
output 2, inserted.name_id into @u (usr_id, name_id);

select * from @n
select * from @u
22 июн 11, 09:12    [10851549]     Ответить | Цитировать Сообщить модератору
 Re: Поддержание уникальности полей связанной таблицы  [new]
deprecated
Member

Откуда:
Сообщений: 4
invm,

ого... а это не сложнее, чем перед вставкой тупо запросить наличие в таблице Names вставляемого имени?
типа
SELECT NameID FROM Names WHERE Name=@Name
и, если ничего не вернётся, то вставлять Name.
в чём плючсы и минусы такого подхода по сравнению с вашим?
22 июн 11, 09:27    [10851614]     Ответить | Цитировать Сообщить модератору
 Re: Поддержание уникальности полей связанной таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
deprecated,

Что есть критерий сложности?
22 июн 11, 11:34    [10852552]     Ответить | Цитировать Сообщить модератору
 Re: Поддержание уникальности полей связанной таблицы  [new]
deprecated
Member

Откуда:
Сообщений: 4
invm,

такого критерия нет.
что-то мне не верится, что нет чего-нибудь попроще, задача, ведь, тривиальная. Хотелось узнать её решение в канонической форме :)
22 июн 11, 11:37    [10852590]     Ответить | Цитировать Сообщить модератору
 Re: Поддержание уникальности полей связанной таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
Если нет критерия, то невозможно сравнить сложность.
Инструкция merge как раз предназначена для решения задач, подобных вашей.
22 июн 11, 11:50    [10852722]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить