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

Откуда:
Сообщений: 39
Подскажите пожалуйста как написать тригер для проверки существует ли уже такое значение в столбце при insert
6 июл 11, 22:05    [10935397]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
maxcab,

Объявите столбец уникальным.
6 июл 11, 22:18    [10935442]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
maxcab
Member

Откуда:
Сообщений: 39
gds

Спасибо за ответ а все таки тригер нельзя добавить
просто у меня в этом столбце повторяются значения null и из за этого не могу сделать его уникальным
6 июл 11, 22:33    [10935492]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
maxcab
gds

Спасибо за ответ а все таки тригер нельзя добавить
просто у меня в этом столбце повторяются значения null и из за этого не могу сделать его уникальным
Можете, есть способы, зависят от версии. Проще будет, чем триггер.
6 июл 11, 22:36    [10935498]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
kkv
Member

Откуда: Москва
Сообщений: 18798
alexeyvg
maxcab
gds

Спасибо за ответ а все таки тригер нельзя добавить
просто у меня в этом столбце повторяются значения null и из за этого не могу сделать его уникальным
Можете, есть способы, зависят от версии. Проще будет, чем триггер.
Проще чем уникальный столбец уже вряд ли придумать. Может стоит подумать о подготовке исходных данных или просто добавить еще поле?
6 июл 11, 22:43    [10935512]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
maxcab
просто у меня в этом столбце повторяются значения null и из за этого не могу сделать его уникальным

Если null разрешено то
create table t1
( 
	t char(1) null unique
)
если нет
create table t1
( 
	t char(1) not null unique
)
6 июл 11, 22:44    [10935514]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
kkv,
gds,

Вы о чём? :-)
6 июл 11, 23:13    [10935577]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
kkv
Member

Откуда: Москва
Сообщений: 18798
alexeyvg
kkv,
gds,

Вы о чём? :-)

уже ни о чем
6 июл 11, 23:53    [10935666]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
maxcab
Member

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

Спасибо огромное!
7 июл 11, 17:47    [10940878]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
gds
Если null разрешено то
create table t1
( 
	t char(1) null unique
)
И сколько же записей со значением поля NULL можно будет иметь в таблице?
Или так и надо было?
7 июл 11, 20:13    [10941557]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
maxcab,

внутри триггера (но триггер - только на insert):
if exists (select * from tab, inserted, where inserted.ID = tab.id) BEGIN
  -- Ой, я облажался, сделал паоле неуникальным, теперь надо делать какие-то телодвижения
END
8 июл 11, 04:54    [10942733]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
Makar4ik
maxcab,

внутри триггера (но триггер - только на insert):
if exists (select * from tab, inserted, where inserted.ID = tab.id) BEGIN
  -- Ой, я облажался, сделал паоле неуникальным, теперь надо делать какие-то телодвижения
END
Во первых ваш триггер будет запрещать вставлять любые записи в таблицу, не только неуникальные.

Во вторых, не понимаю, чем констрейн-то хуже???
8 июл 11, 09:15    [10943046]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Makar4ik
maxcab,

внутри триггера (но триггер - только на insert):
if exists (select * from tab, inserted, where inserted.ID = tab.id) BEGIN
  -- Ой, я облажался, сделал паоле неуникальным, теперь надо делать какие-то телодвижения
END
Если триггер AFTER INSERT, этот IF EXISTS() будет всегда давать TRUE!
Ибо к моменту вызова триггера все записи уже вставлены в таблицу.
8 июл 11, 09:20    [10943061]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
Makar4ik
maxcab,

внутри триггера (но триггер - только на insert):
if exists (select * from tab, inserted, where inserted.ID = tab.id) BEGIN
  -- Ой, я облажался, сделал паоле неуникальным, теперь надо делать какие-то телодвижения
END
Если триггер AFTER INSERT, этот IF EXISTS() будет всегда давать TRUE!
Ибо к моменту вызова триггера все записи уже вставлены в таблицу.
Это если inserted относится именно к tab, конечно.
8 июл 11, 09:22    [10943066]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
IApple
Member

Откуда:
Сообщений: 320
alexeyvg
Можете, есть способы, зависят от версии. Проще будет, чем триггер.

Какой способ ? Мне интересно для MSSQL 2008 Express.
8 июл 11, 10:54    [10943805]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
IApple
alexeyvg
Можете, есть способы, зависят от версии. Проще будет, чем триггер.

Какой способ ? Мне интересно для MSSQL 2008 Express.
Фильтрованный уникальный индекс, видимо
8 июл 11, 10:58    [10943835]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
iap
IApple
Какой способ ? Мне интересно для MSSQL 2008 Express.
Фильтрованный уникальный индекс, видимо
Ага, для 2008-го он.
8 июл 11, 11:10    [10943943]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
iap
iap
пропущено...
Если триггер AFTER INSERT, этот IF EXISTS() будет всегда давать TRUE!
Ибо к моменту вызова триггера все записи уже вставлены в таблицу.
Это если inserted относится именно к tab, конечно.

Ой, да, конечно... Before INSERT, я вчера наверное уже спал...

А для After insert - вот такое сойдет
if exists(select inserted.id from tab, inserted where tab.id = inserted.id group by inserted.id having count(inserted.id)>1)
8 июл 11, 17:17    [10947418]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
Makar4ik
Before INSERT
???
8 июл 11, 17:23    [10947458]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
Le Peace
Makar4ik
Before INSERT
???
FOR
8 июл 11, 17:46    [10947662]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
Makar4ik
Le Peace
пропущено...
???
FOR


БОЛ
FOR | AFTER

Тип AFTER указывает, что триггер DML срабатывает только после успешного выполнения всех операций в инструкции SQL, запускаемой триггером. Все каскадные действия и проверки ограничений, на которые имеется ссылка, должны быть успешно завершены, прежде чем триггер сработает.

Если единственным заданным ключевым словом является FOR, аргумент AFTER используется по умолчанию.

Триггеры AFTER не могут быть определены на представлениях.
8 июл 11, 17:58    [10947759]     Ответить | Цитировать Сообщить модератору
 Re: Тригер проверка на существование идентичной записи при инсерт  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Makar4ik
А для After insert - вот такое сойдет
if exists(select inserted.id from tab, inserted where tab.id = inserted.id group by inserted.id having count(inserted.id)>1)
Непонятно, что тут такого, что могло бы помочь.
И завязывайте с запятой. Это не модно!
Триггер лучше INSTEAD OF INSERT.
Фильтрованный уникальный индекс ещё лучше.
8 июл 11, 19:25    [10948210]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить