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

Откуда:
Сообщений: 30
есть таблица, при добавлении в нее данных хочу проверять на наличие существующих записей
делаю так:

ALTER TABLE dbo.Lead
WITH NOCHECK ADD CONSTRAINT Lead_CheckExistsLead CHECK NOT FOR REPLICATION ([dbo].[fn_CheckExistsLeads]([SiteId],[MobilePhone],[Email])=(0))
GO

и
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION dbo.fn_CheckExistsLeads(
    @SiteId uniqueidentifier,
    @MobilePhone varchar(255),
    @Email varchar(255))
  RETURNS int
  AS
BEGIN
  DECLARE @retval int
  if @SiteId is NULL
  begin
  select @retval = count(id)
    FROM [dbo].[Lead] 
    WHERE [SiteId] is null and
          [MobilePhone] = @MobilePhone and
          [Email] = @Email
   end
  else
  begin  select @retval = count(id)
    FROM [dbo].[Lead]
    WHERE [SiteId] = @SiteId and
          [MobilePhone] = @MobilePhone and
          [Email] = @Email
   end
  RETURN @retval
END


и при попытке insert получаю всегда ошибку: "Конфликт инструкции INSERT с ограничением CHECK "Lead_CheckExistsLead"."
что я делаю не так?
31 янв 16, 14:05    [18752291]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, с CHECK CONSTRAINT  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
ЕНЯ,

нужен просто CONSTRAINT UNIQUE.
31 янв 16, 14:40    [18752373]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, с CHECK CONSTRAINT  [new]
ЕНЯ
Member

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

а таким как у меня способом не будет работать?
31 янв 16, 16:13    [18752574]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, с CHECK CONSTRAINT  [new]
ЕНЯ
Member

Откуда:
Сообщений: 30
и как быть если уже есть существующие, такие комбинации? которые надо оставить
31 янв 16, 16:20    [18752594]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, с CHECK CONSTRAINT  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
ЕНЯ
а таким как у меня способом не будет работать?
Упорно желаете заставить сервер заниматься мазохизмом?
К счастью для него, ничего у вас не выйдет - физически запись в таблицу вставляется раньше, чем проверяется ограничение.
31 янв 16, 16:36    [18752620]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, с CHECK CONSTRAINT  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Невнимательно посмотрел.
Получится через функцию, только условие в check нужно изменить.
Но лучше так не делать, а завести, как уже советовали, unique constraint.
31 янв 16, 16:54    [18752677]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, с CHECK CONSTRAINT  [new]
ЕНЯ
Member

Откуда:
Сообщений: 30
invm
Получится через функцию, только условие в check нужно изменить.

т.е.условие в check сделать =1 ?

invm
Но лучше так не делать, а завести, как уже советовали, unique constraint.

можно ли сделать unique constraint, чтоб остались старые данные которые не соответствуют этому правилу?
31 янв 16, 17:34    [18752803]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, с CHECK CONSTRAINT  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
ЕНЯ
т.е.условие в check сделать =1 ?
< 2
ЕНЯ
можно ли сделать unique constraint, чтоб остались старые данные которые не соответствуют этому правилу?
Если есть признак, отличающий старые данные от новых, то можно сделать фильтрованный уникальный индекс.
Или ограничение уникальности по требуемым столбцам + вычисляемый столбец на основе PK и этого признака.
31 янв 16, 18:11    [18752864]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, с CHECK CONSTRAINT  [new]
ЕНЯ
Member

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

а какой из предложенных вариантов, дешевле для базы?
31 янв 16, 18:38    [18752921]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, с CHECK CONSTRAINT  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
ЕНЯ
invm,

а какой из предложенных вариантов, дешевле для базы?
Чек-констрейн с функцией дороже и непредсказуемей, остальные варианты дешевле.

Ещё можно триггер сделать.
31 янв 16, 21:32    [18753348]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить