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

Откуда: СПб
Сообщений: 270
Всем доброго дня!

Подскажите, пожалуйста, как реализовать чтобы в поле вставлялось значение от столбца идентификатора?

а теперь подробнее:

есть таблица
CREATE TABLE dbo.Device(
  IdDevice INT IDENTITY,
  KKS NVARCHAR(16) NOT NULL,
  [DESC] NVARCHAR(255) NULL,
  REF_TYPE INT NULL,
  PARENT INT NOT NULL DEFAULT (0),
  Setting CHAR(2) NOT NULL DEFAULT ('OU'),
  CONSTRAINT PK_Destination PRIMARY KEY (IdDevice)
) ON [PRIMARY]


Теперь когда вставляется "Верхний уровень" нужно чтобы поле PARENT содержало тоже значение, что и IdDevice.

Может кто подскажет как такое реализовать???
17 июн 13, 17:44    [14443961]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
sequence вместо identity ?
17 июн 13, 17:46    [14443982]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Можно поподробней об sequence!!!!

Может кините ссылку где почитать, слету на сайте майкрософта найти не удалось
17 июн 13, 17:53    [14444029]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
http://msdn.microsoft.com/en-us/library/ff878091.aspx
17 июн 13, 18:03    [14444080]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
vso
Member

Откуда: СПб
Сообщений: 270
к сожалению, у меня SQL 2008R2 Express
17 июн 13, 18:08    [14444107]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
как насчет сделать поле nullable?
было бы логично
17 июн 13, 18:29    [14444226]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
HelenM
Member

Откуда: Москва
Сообщений: 53
Веткин Сергей,

>>теперь, когда вставляется...

первое, что приходит в голову - использовать триггер.

Насчет совета разрешать NULL - не понимаю смысла: назначен же дефолт, подлежащий замене.
17 июн 13, 21:58    [14444698]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
HelenM
Насчет совета разрешать NULL - не понимаю смысла: назначен же дефолт, подлежащий замене.
ну как...
если "Верхний уровень" родителя не имеет, тут все понятно
если он сам себе родитель (как хочет автор) это тоже еще можно понять

но последнее что мне приходит в голову - назначить несуществующего родителя
может я слишком узко мыслю не знаю...
17 июн 13, 22:11    [14444724]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Дело в том, что мне нужна ссылка сама на себя, когда я таблицу саму на себя делаю INNER JOIN в запросе и у меня складывается связь необходимая мне.

По поводу триггера, подскажите это решение оптимально?

CREATE TRIGGER Device_AI01 ON dbo.Device AFTER INSERT AS
  DECLARE @P INT

  SELECT @P = i.PARENT FROM INSERTED i

  IF @P = 0
    UPDATE T1
    SET PARENT = T2.IdDevice
    FROM Device T1
    INNER JOIN INSERTED T2 ON T1.IdDevice = T2.IdDevice

GO
18 июн 13, 09:05    [14445714]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
baracs
Member

Откуда: Москва
Сообщений: 7204
Веткин Сергей
Дело в том, что мне нужна ссылка сама на себя, когда я таблицу саму на себя делаю INNER JOIN в запросе и у меня складывается связь необходимая мне.

По поводу триггера, подскажите это решение оптимально?

CREATE TRIGGER Device_AI01 ON dbo.Device AFTER INSERT AS
  DECLARE @P INT

  SELECT @P = i.PARENT FROM INSERTED i

  IF @P = 0
    UPDATE T1
    SET PARENT = T2.IdDevice
    FROM Device T1
    INNER JOIN INSERTED T2 ON T1.IdDevice = T2.IdDevice

GO
Вы вставляете строго по 1 строке? (Это вопрос по выделенному.)

Значение поля PARENT можно проверить в разделе WHERE, прямо в запросе.
18 июн 13, 09:47    [14445943]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
лучше всего, ятд, использовать Предложение OUTPUT (Transact-SQL)
18 июн 13, 09:51    [14445961]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2995
Веткин Сергей
Теперь когда вставляется "Верхний уровень" нужно чтобы поле PARENT содержало тоже значение, что и IdDevice.

Может кто подскажет как такое реализовать???


а как определяется, что это "верхний уровень", а этот нет?
18 июн 13, 09:55    [14445983]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Веткин Сергей
Дело в том, что мне нужна ссылка сама на себя, когда я таблицу саму на себя делаю INNER JOIN в запросе и у меня складывается связь необходимая мне.
если сделать left join, то NULL-ы не помешают
выглядеть будет так, что у верхнего уровня родителя просто нет
18 июн 13, 10:06    [14446063]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
+ Пример OUTPUT:
if object_id('tempdb..#Device') is not null drop table #Device
CREATE TABLE #Device(
  IdDevice INT IDENTITY,
  KKS NVARCHAR(16) NOT NULL,
  [DESC] NVARCHAR(255) NULL,
  REF_TYPE INT NULL,
  PARENT INT NOT NULL DEFAULT (0),
  Setting CHAR(2) NOT NULL DEFAULT ('OU'),
  CONSTRAINT PK_Destination PRIMARY KEY (IdDevice)
  )
declare @Ids table (id int, KKS nvarchar(16))

insert #Device(KKS, [DESC]) 
   output inserted.IdDevice,inserted.KKS into @Ids
   values ('KKS_MAIN','Основное устройство')
insert #Device(KKS, [DESC], PARENT)
   select 'KKS-Detail1','Деталь № 1', i.id
   from @ids i
insert #Device(KKS, [DESC], PARENT)
   select 'KKS-Detail2','Деталь № 2', i.id
   from @ids i

delete @ids

insert #Device(KKS, [DESC]) 
   output inserted.IdDevice,inserted.KKS into @Ids
   values ('KKS_dev2','Устройство № 2'),('KKS_dev3','Устройство № 3')
insert #Device(KKS, [DESC], PARENT)
   select c.KKS, c.[DESC], i.id
   from @Ids i
   cross join (values ('KKS_dev2-1','Деталь 2-1'),('KKS_dev2-2','Деталь 2-2'),('KKS_dev2-3','Деталь 2-3')) c(KKS, [DESC])
   where i.KKS='KKS_dev2'
insert #Device(KKS, [DESC], PARENT)
   select c.KKS, c.[DESC], i.id
   from @Ids i
   cross join (values ('KKS_dev3-1','Деталь 3-1')) c(KKS, [DESC])
   where i.KKS='KKS_dev3'

select * from #Device

drop table #Device
IdDeviceKKSDESCREF_TYPEPARENTSetting
1KKS_MAINОсновное устройствоNULL0OU
2KKS-Detail1Деталь № 1NULL1OU
3KKS-Detail2Деталь № 2NULL1OU
4KKS_dev2Устройство № 2NULL0OU
5KKS_dev3Устройство № 3NULL0OU
6KKS_dev2-1Деталь 2-1NULL4OU
7KKS_dev2-2Деталь 2-2NULL4OU
8KKS_dev2-3Деталь 2-3NULL4OU
9KKS_dev3-1Деталь 3-1NULL5OU
18 июн 13, 10:17    [14446117]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
vso
Member

Откуда: СПб
Сообщений: 270
HandKot
а как определяется, что это "верхний уровень", а этот нет?


если вставляется в поле PARENT значение 0, то это верхний уровень
18 июн 13, 10:36    [14446241]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2995
Веткин Сергей,
может оставить как есть, а с таблицей работать через вьюху, в которой и делать подмену

case when parent = 0 then iddevice else parent end
18 июн 13, 10:47    [14446313]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
vso
Member

Откуда: СПб
Сообщений: 270
baracs
Вы вставляете строго по 1 строке? (Это вопрос по выделенному.)


Предполагается, что в программе есть форма для ввода данных и за 1 раз можно ввести только 1 значение
18 июн 13, 10:51    [14446336]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
vso
Member

Откуда: СПб
Сообщений: 270
HandKot
Веткин Сергей,
может оставить как есть, а с таблицей работать через вьюху, в которой и делать подмену


Эта идея мне нравится, только интересно производительность не пострадает от этого???

Просто я сейчас процессе модернизации существующей БД, и в тестовых данных, которые есть у меня уже больше 4000 записей.
18 июн 13, 10:55    [14446371]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Просто мне кажется, что меньше по стоимости будет повесить триггер, т.к. это таблица не с постоянным вводом данных, а только с переодическим
18 июн 13, 10:59    [14446397]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
baracs
Member

Откуда: Москва
Сообщений: 7204
Веткин Сергей
baracs
Вы вставляете строго по 1 строке? (Это вопрос по выделенному.)


Предполагается, что в программе есть форма для ввода данных и за 1 раз можно ввести только 1 значение
Опрометчиво писать серверный код в расчете на особенности какой-то одной клиентской программы...
18 июн 13, 11:30    [14446565]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
Веткин Сергей
Просто мне кажется, что меньше по стоимости будет повесить триггер, т.к. это таблица не с постоянным вводом данных, а только с переодическим

вьюха быстрее....
18 июн 13, 13:13    [14447464]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Ivan Durak
Веткин Сергей
Просто мне кажется, что меньше по стоимости будет повесить триггер, т.к. это таблица не с постоянным вводом данных, а только с переодическим

вьюха быстрее....


да ладно? когда это расчеты были быстрее, чем выбор по индексу готовых данных?
18 июн 13, 13:44    [14447729]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
Crimean
Ivan Durak
пропущено...

вьюха быстрее....


да ладно? когда это расчеты были быстрее, чем выбор по индексу готовых данных?

конкретно тут вьюха тоже будет использовать индекс!! и выбирать готовые данные, один case никто даже не сможет измерить в нагрузке cpu.
Ну и триггер вы забыли? тут снижение скорости реальное
18 июн 13, 13:56    [14447829]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
baracs
Member

Откуда: Москва
Сообщений: 7204
Ivan Durak
Crimean
пропущено...


да ладно? когда это расчеты были быстрее, чем выбор по индексу готовых данных?

конкретно тут вьюха тоже будет использовать индекс!! и выбирать готовые данные, один case никто даже не сможет измерить в нагрузке cpu.
Ну и триггер вы забыли? тут снижение скорости реальное
Скорости вставки а не выборки.
Судя по этому сообщению, вставки там единичные. Т.е. снижение их скорости никто не заметит.
18 июн 13, 14:36    [14448138]     Ответить | Цитировать Сообщить модератору
 Re: При вставке продублировать значение ID поля  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
baracs
вставки там единичные. Т.е. снижение их скорости никто не заметит.

"Опрометчиво писать серверный код в расчете на особенности какой-то одной клиентской программы..."
18 июн 13, 16:33    [14449131]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить