powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Атоинкремент отдельно в каждой строке.
17 сообщений из 17, страница 1 из 1
Атоинкремент отдельно в каждой строке.
    #38867190
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FB 2.5

Таблица небольшая состоящая из имен и индекса для имени:
Код: plaintext
1.
2.
3.
id  name   ind
1  скалка    1
2  колос     1
3  соска     2

Клиент берет базовое имя и присовокупляет к нему индекс (к примеру, получается колос-1 ), после значение индекса в строке клиентская программа увеличивает на единицу. Это как сейчас сделано. Для каждой строки индекс независим.
Хотелось бы чтобы не клиент занимался индексами, а инкрементировал сервер. Но как?
Соображалки не хватает чтобы придумать.
Триггер на строку... Похоже на бредятину.
ХП? А тогда, вроде как, ничего и не меняется: что update с клиента, что вызов процедуры оттуда же, разницы особой не видно.

Может чего посоветуете.
...
Рейтинг: 0 / 0
Атоинкремент отдельно в каждой строке.
    #38867237
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Клиент 1 читает индекс, получает, скажем, 10. Задумывается.
Клиент 2 читает индекс, получает те же 10. Быстро решает, что это конец света и инкрементирует до 11. Коммит!
Клиент 1, слоупочина, отмирает и решает тоже инкрементировать индекс.

И дальше уже можно гадать: это был снэпшот и вскинется исключение по поводу модификации изменённой записи, или же это всё в разных транзакциях было и мы поимеем в БД левую информацию - 11 вместо 12.
...
Рейтинг: 0 / 0
Атоинкремент отдельно в каждой строке.
    #38867241
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предлагаю Вам осветить более подробно вот этот момент: "Клиент берет базовое имя и присовокупляет к нему индекс". Для чего это делается в конечном итоге?
...
Рейтинг: 0 / 0
Атоинкремент отдельно в каждой строке.
    #38867242
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08Хотелось бы чтобы не клиент занимался индексами, а инкрементировал сервер. Но как?Приведите пример входных данных (в виде create table + insert-команд) и конечного (требуемого) результата.
...
Рейтинг: 0 / 0
Атоинкремент отдельно в каждой строке.
    #38867249
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE NAMES (
    ID       INTEGER NOT NULL,
    NM     VARCHAR(40),
    TEK_IND  INTEGER
);
--начальное состояние таблицы:
insert into names (id, nm, ind) values (1, 'Бабочка', 1);
insert into names (id, nm, ind) values (2, 'Серна', 1);
insert into names (id, nm, ind) values (3, 'Барчук', 1);


Клиент читает выбранное юзером имя и делает конкатенацию из имени и индекса.
Получается, например, "Серна-1".
При выходе из формы где добавляется объект с этим именем, в соответствующей строке таблицы имен меняется индекс, увеличенный на единицу, самим клиентом:
Код: plsql
1.
update imena set ind = 2 where id = 2'


Следующий вызов имени и конкатенация должна привести к другому имени - "Серна-2".
Если бы можно было иметь дырки в индексах, то и вопроса не было.
...
Рейтинг: 0 / 0
Атоинкремент отдельно в каждой строке.
    #38867251
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08Клиент читает выбранное юзером имя и делает конкатенацию из имени и индекса.
то есть, приложение не многопользовательское?
...
Рейтинг: 0 / 0
Атоинкремент отдельно в каждой строке.
    #38867253
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полученное составное имя используется совсем в другой таблице никак не связанной с таблицей имен.
...
Рейтинг: 0 / 0
Атоинкремент отдельно в каждой строке.
    #38867254
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот и хочу чтобы не клиент этой ерундой занимался, а сервер (так было заявлено в первом моем пост).
Что будет с БД дальше не ведомо и поэтому не хочу заморачиваться на монопольный режим.
...
Рейтинг: 0 / 0
Атоинкремент отдельно в каждой строке.
    #38867255
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08Я вот и хочу
Перехоти. У тебя нет выбора.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Атоинкремент отдельно в каждой строке.
    #38867257
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выбор всегда есть :)
Видно, делится не хотите шибко секретной информацией. ай-яй.
...
Рейтинг: 0 / 0
Атоинкремент отдельно в каждой строке.
    #38867259
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
-- таблица блокировок
CREATE TABLE LOCKS(
  CLIENT_ID INTEGER NOT NULL,
  ITEM_ID INTEGER NOT NULL
);

CREATE UNIQUE INDEX IDX1 ON LOCKS(CLIENT_ID, ITEM_ID);

CREATE PROCEDURE READ_AND_INC(ITEM_ID INTEGER)
RETURNS(ITEM_NAME VARCHAR(48)) 
AS 
  DECLARE VARIABLE V_IDX INTEGER; 
  DECLARE VARIABLE V_NAME VARCHAR(40),
BEGIN
  SELECT FIRST 1 NM, TEK_IND + 1
  FROM NAMES
  WHERE ID = :ITEM_ID
  INTO :V_NAME, :V_IDX;

  UPDATE NAMES(TEK_IND)
  SET (:V_IDX)
  WHERE ID = :ITEM_ID;

  ITEM_NAME = :V_NAME || '-' || CAST(:V_IDX AS VARCHAR(8));
END;

-- на клиенте:

-- блокируем грязную серну
INSERT INTO LOCKS(CLIENT_ID, ITEM_ID)
VALUES (12345, 2); 
COMMIT; -- гарантирует уникальный замок

-- приватно инкрементируем серну по самые носороги
call READ_AND_INC...

-- беги, беги грязная серна, пока ещё можешь!
DELETE * FROM LOCKS
WHERE CLIENT_ID = 12345 AND ITEM_ID = 2;
COMMIT;

/*
-- на выходе из программы отпускаем всех неотпущенных животных
DELETE * FROM LOCKS
WHERE CLIENT_ID = 12345;
*/
...
Рейтинг: 0 / 0
Атоинкремент отдельно в каждой строке.
    #38867261
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08Я вот и хочу чтобы не клиент этой ерундой занимался, а сервер
без разницы. генератор выдает сквозные номера, а у вас в столбце ind неуникальные значения. Генератор сам по себе работает через монопольный доступ, так и тут придется "монополизировать" выдачу номеров. Другое дело, что для "несквозных" номеров у сервера нет средств.

У вас уже спрашивали, зачем нужен вот этот столбец ind. Если он нужен только для сортировки в пределах name, тогда сделайте столбец ind типом timestamp, и просто туда записывайте current_timestamp, принудительно.
...
Рейтинг: 0 / 0
Атоинкремент отдельно в каждой строке.
    #38867263
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пардон, разумеется
Код: sql
1.
CREATE UNIQUE INDEX IDX1 ON LOCKS(ITEM_ID);
...
Рейтинг: 0 / 0
Атоинкремент отдельно в каждой строке.
    #38867265
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrCat , спасибо.
Все почти понятно. Если не сложно, поясни, пож., как "уникальный замок" сработает?
...
Рейтинг: 0 / 0
Атоинкремент отдельно в каждой строке.
    #38867268
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrCat,

и всё это заменимо всего лишь одним оператором - UPDATE RETURNING, насколько я вообще могу понять "задачу"
...
Рейтинг: 0 / 0
Атоинкремент отдельно в каждой строке.
    #38867270
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvзачем нужен вот этот столбец ind.
Вроде бы уж объяснил - другого объяснения то нет все равно.
Представьте себе, что имена в этом проекте даются так же как это делалось во времена монархов.
К примеру, Людовик V, Людовик VI и т.п. Вряд ли у них были дырки в этих номерах.
Здесь та же история. Индексы нужны только для подстановки к базовым именам. Сортировка ни при чем.
...
Рейтинг: 0 / 0
Атоинкремент отдельно в каждой строке.
    #38867273
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladMrCat,и всё это заменимо всего лишь одним оператором - UPDATE RETURNING,
Во, уже какие-то все же варианты есть. Замечательно.
Иногда пинка просто получаешь и как-то нужная картинка складывается
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Атоинкремент отдельно в каждой строке.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]