Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Атоинкремент отдельно в каждой строке. / 17 сообщений из 17, страница 1 из 1
29.01.2015, 19:55
    #38867190
SAN_01_08
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атоинкремент отдельно в каждой строке.
FB 2.5

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

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

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

И дальше уже можно гадать: это был снэпшот и вскинется исключение по поводу модификации изменённой записи, или же это всё в разных транзакциях было и мы поимеем в БД левую информацию - 11 вместо 12.
...
Рейтинг: 0 / 0
29.01.2015, 21:33
    #38867241
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атоинкремент отдельно в каждой строке.
Предлагаю Вам осветить более подробно вот этот момент: "Клиент берет базовое имя и присовокупляет к нему индекс". Для чего это делается в конечном итоге?
...
Рейтинг: 0 / 0
29.01.2015, 21:37
    #38867242
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атоинкремент отдельно в каждой строке.
SAN_01_08Хотелось бы чтобы не клиент занимался индексами, а инкрементировал сервер. Но как?Приведите пример входных данных (в виде create table + insert-команд) и конечного (требуемого) результата.
...
Рейтинг: 0 / 0
29.01.2015, 22:00
    #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
29.01.2015, 22:06
    #38867251
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атоинкремент отдельно в каждой строке.
SAN_01_08Клиент читает выбранное юзером имя и делает конкатенацию из имени и индекса.
то есть, приложение не многопользовательское?
...
Рейтинг: 0 / 0
29.01.2015, 22:08
    #38867253
SAN_01_08
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атоинкремент отдельно в каждой строке.
Полученное составное имя используется совсем в другой таблице никак не связанной с таблицей имен.
...
Рейтинг: 0 / 0
29.01.2015, 22:10
    #38867254
SAN_01_08
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атоинкремент отдельно в каждой строке.
Я вот и хочу чтобы не клиент этой ерундой занимался, а сервер (так было заявлено в первом моем пост).
Что будет с БД дальше не ведомо и поэтому не хочу заморачиваться на монопольный режим.
...
Рейтинг: 0 / 0
29.01.2015, 22:19
    #38867255
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атоинкремент отдельно в каждой строке.
SAN_01_08Я вот и хочу
Перехоти. У тебя нет выбора.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.01.2015, 22:21
    #38867257
SAN_01_08
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атоинкремент отдельно в каждой строке.
Выбор всегда есть :)
Видно, делится не хотите шибко секретной информацией. ай-яй.
...
Рейтинг: 0 / 0
29.01.2015, 22:24
    #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
29.01.2015, 22:27
    #38867261
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атоинкремент отдельно в каждой строке.
SAN_01_08Я вот и хочу чтобы не клиент этой ерундой занимался, а сервер
без разницы. генератор выдает сквозные номера, а у вас в столбце ind неуникальные значения. Генератор сам по себе работает через монопольный доступ, так и тут придется "монополизировать" выдачу номеров. Другое дело, что для "несквозных" номеров у сервера нет средств.

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

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


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