Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как сделать интеллектуальное IDENTITY
|
|||
|---|---|---|---|
|
#18+
Проблема такая. Есть табличка, в которой есть поле типа ключа, пусть будет ID. Если заносится новая запись, то в поле ID заносится новое максимальное значение. Но простое IDENTITY не проходит, так как проблема такая. Если я потом удаляю, к промеру, запись с ID = 5, к примеру, то при следующем добавлении я должен проверить, есть ли "сквозняки" в номерах ID и использовать именно эти "выпавшие" номера. Похоже, это работа под тригер, но я совсем совсем poor SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2001, 16:07 |
|
||
|
Как сделать интеллектуальное IDENTITY
|
|||
|---|---|---|---|
|
#18+
Вообще вешать триггер, который будет менять ключевое поле крайне неразумно, особенно, если клиент дельфовый и запись производится по принципу TDataSet.Post. При этом возникает ошибка EDBEngineError (Another user has changed current record). Эту проблему лучше решать с помощью Stored procedure, запихивая в качестве аргумента, соответствующего этому ключевому полю, некую бредятину, например -1, а в теле процедуры вычислять нужное значение и возвращать его клиенту в виде OUTPUT параметра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2001, 23:26 |
|
||
|
Как сделать интеллектуальное IDENTITY
|
|||
|---|---|---|---|
|
#18+
Ключ = это только ключ, и ничего больше. Так что на мой взгляд самое правильное - пересмотреть свой поход к структуре данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2001, 04:51 |
|
||
|
Как сделать интеллектуальное IDENTITY
|
|||
|---|---|---|---|
|
#18+
Пусть будет не ключ - нет проблем. Грубо говоря, поле. Просто поле типа INT. Delphi абсолютно не при чем. Работа из VB + C++ через ADO, потому и нужно все впихнуть внутрь базы - нельзя это делать за счет программной логики. И какой-то идеи на счет алгоритма поиска "дырки" нет. Кажется, надо сначала разбить значения ключа на сотни, к примеру, и посмотреть, если в диапазоне от 101 до 200 есть сто строк, то здесь дырки нет. А если в этом диапазоне есть дырка, то записей будет меньше, и тогда что? Переходить по одной от 101 и до..., запоминая предыдущее значение? Никаких идей нет? Скорее всего, кто-то реализовывал подобное, может, кто ссылку даст? И еще - UDF нельзя, SQL 7.0. Благодарен за любые намеки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2001, 07:37 |
|
||
|
Как сделать интеллектуальное IDENTITY
|
|||
|---|---|---|---|
|
#18+
вообщем вижу такой путь: допустим имя твоей таблицы TBL: 1. Содаешь вспомогательную таблицу, которая будет генерить уникальные ID-шники для ключа (IDSource) 2. Создаешь еще одну таблицу в которой будушь хранить ключи для удаленных записей. (IDDeleted) 3. Создаешь триггкр на удаление из исходной таблицы, который будет копировать удаленные ID-шники в IDDeleted 4. Insert в TBL делаешь через продцедуру. В ней сначала проверяешь есть ли что нибудь в IDDeleted. Если есть берешь ID-шник оттуда, после чего удаляешь соотв. запись, если нет берешь из IDSource. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2001, 08:49 |
|
||
|
Как сделать интеллектуальное IDENTITY
|
|||
|---|---|---|---|
|
#18+
примерно такой код: create table IDSource (ID int IDENTITY, Desc char(3)) create table IDDeleted (ID int) create trigger TR_DELonTBL on TBL for DELETE as insert into IDDeleted select ID from deleted create proc INSintoTBL as declare @ID int if exists (select ID from IDDeleted) begin select @ID=ID from IDDeleted where ID in (select min(ID) from IDDeleted) delete from IDDeleted where ID=@ID insert into TBL (ID, ...) values (@ID, ....) end else begin insert into IDSource select 'bla' insert into TBL (ID, ...) values (@@IDENTITY,....) end ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2001, 09:07 |
|
||
|
Как сделать интеллектуальное IDENTITY
|
|||
|---|---|---|---|
|
#18+
SELECT TOP 1 * FROM Your_Table WHERE Your_Column IS NULL вернет первую запись с дыркой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2001, 16:22 |
|
||
|
Как сделать интеллектуальное IDENTITY
|
|||
|---|---|---|---|
|
#18+
Если, например, используется таблица Products, то так: DECLARE @minidentval int DECLARE @nextidentval int SET IDENTITY_INSERT Products ON SELECT @minidentval = MIN(IDENTITYCOL) FROM Products IF @minidentval = IDENT_SEED('Products') SELECT @nextidentval = MIN(IDENTITYCOL) + IDENT_INCR('Products') FROM Products o WHERE IDENTITYCOL BETWEEN IDENT_SEED('Products') AND 2147483647 AND NOT EXISTS (SELECT * FROM Products oo WHERE oo.IDENTITYCOL = o.IDENTITYCOL + IDENT_INCR('Products')) ELSE SELECT @nextidentval = IDENT_SEED('Products') set @ProdId = @nextidentval ... insert ... SET IDENTITY_INSERT Products OFF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2001, 02:03 |
|
||
|
Как сделать интеллектуальное IDENTITY
|
|||
|---|---|---|---|
|
#18+
В SP приблизительно так: IF NOT EXISTS(SELECT Doc_No FROM Docs) SELECT @Doc_No=1 ELSE SELECT @Doc_No=MIN(D.Doc_No) + 1 FROM Docs D WHERE NOT EXISTS(SELECT * FROM Docs D2 WHERE D2.Doc_No=D.Doc_No + 1) Собственно говоря, в этой таблице есть свой PK и он - IDENTITY, но вот номера документов должны идти "сплошняком". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2001, 12:51 |
|
||
|
Как сделать интеллектуальное IDENTITY
|
|||
|---|---|---|---|
|
#18+
--Есть такой вариант: --- создаем временную таблицу, в которой будут все номера подряд (или храним эту таблицу в базе) DECLARE @count int SET @count = 1 CREATE TABLE #tmp (code int) WHILE @count<190 BEGIN INSERT INTO #tmp (code) VALUES (@count) SET @count = @count + 1 END --Затем получаем все свободные номера и берем какой нужно. SELECT code FROM #tmp WHERE #tmp.code NOT IN (SELECT code_category FROM category) ORDER BY code ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2001, 10:02 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3569&tid=1826503]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
31ms |
get topic data: |
10ms |
get forum data: |
4ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 277ms |
| total: | 414ms |

| 0 / 0 |
