Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вставка минимальное незанятого числа / 22 сообщений из 22, страница 1 из 1
13.03.2016, 17:52
    #39190923
sanringo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
Имеется таблица
Код: plsql
1.
2.
3.
4.
5.
CREATE TABLE "public"."my_table" (
"number" int4,
"name" TEXT
)
WITH (OIDS=FALSE)



Имеется insert
Код: plsql
1.
INSERT INTO my_table ("name") VALUES ("fff");


Нужно, чтобы number автоматом формировался минимальным из незанятых.

Попробовал эту задачу решить через последовательности
Код: plsql
1.
2.
3.
4.
5.
6.
CREATE SEQUENCE "public"."number_seq"
 INCREMENT 1
 MINVALUE 1
 MAXVALUE 9223372036854775807
 RESTART 1
 CACHE 1;


Код: plsql
1.
"number" int4 DEFAULT nextval('number_seq'::regclass) NOT NULL,


Добавил, удалил несколько записей и всё равно нумерация сохраняется. Можно эту задачу решить через последовательности? Или только через триггер, ХП
...
Рейтинг: 0 / 0
13.03.2016, 17:57
    #39190926
sanringo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
т.е. нужно заполнить "дырки"
...
Рейтинг: 0 / 0
13.03.2016, 19:35
    #39190959
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
Только ХП с эксклюзивным локом на всю таблицу на время операции.
...
Рейтинг: 0 / 0
13.03.2016, 19:47
    #39190965
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
sanringoт.е. нужно заполнить "дырки"
допустимо и решаемо, если поставить нормальный PK с дырками первым полем с именем Id.
Я так понимаю, при удалении записи мы можем постоянно при вставке получать номер "22" одинаковым?
...
Рейтинг: 0 / 0
13.03.2016, 20:52
    #39190985
sanringo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
Сформулирую по-другому. Имеем таблицу с заполненым полем (1,2,4,5...). Процедура должна выдать 3
...
Рейтинг: 0 / 0
13.03.2016, 22:35
    #39191017
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
sanringo,

1)
alter table public.my_table
alter column number type serial;

и не париться
:)

2)
еще можно посмотреть
на функцию generate_series
...
Рейтинг: 0 / 0
13.03.2016, 22:36
    #39191018
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
sanringoСформулирую по-другому.
спрошу по другому.
После удаления записи с "3" следующая вставка будет опять с 3?
...
Рейтинг: 0 / 0
14.03.2016, 01:53
    #39191041
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
sanringoИмеется таблица
Код: plsql
1.
2.
3.
4.
5.
CREATE TABLE "public"."my_table" (
"number" int4,
"name" TEXT
)
WITH (OIDS=FALSE)



Имеется insert
Код: plsql
1.
INSERT INTO my_table ("name") VALUES ("fff");


Нужно, чтобы number автоматом формировался минимальным из незанятых.

Попробовал эту задачу решить через последовательности
Код: plsql
1.
2.
3.
4.
5.
6.
CREATE SEQUENCE "public"."number_seq"
 INCREMENT 1
 MINVALUE 1
 MAXVALUE 9223372036854775807
 RESTART 1
 CACHE 1;


Код: plsql
1.
"number" int4 DEFAULT nextval('number_seq'::regclass) NOT NULL,


Добавил, удалил несколько записей и всё равно нумерация сохраняется. Можно эту задачу решить через последовательности? Или только через триггер, ХП

1)через последовательности не решается
2)от вас уже второе письмо с некорректной по сути задачей (т.е. из серии так делать никогда и никому не надо если им не хочется проблемы с базой иметь), из чего я предполагаю кривое ТЗ.
3)через триггер с ПОЛНОЙ блокировкой таблицы на конкурентную запись - решается но вставка будет ghm не быстрая особенно если таблица большая (так как для поиска дырок надо будет всю таблицу пересматривать). Возможно извратится и держать до кучи еще и таблицу дырок (и обновлять ее через before delete триггер) - тогда будет быстро но уже совсем сложно.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
14.03.2016, 21:28
    #39191785
sanringo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
Petro123sanringoСформулирую по-другому.
спрошу по другому.
После удаления записи с "3" следующая вставка будет опять с 3?
Совершенно верно

Вот, что у меня получилось
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE OR REPLACE FUNCTION get_minimal_free_number() RETURNS INTEGER
LANGUAGE PLPGSQL AS
$$
BEGIN
	RETURN (
		SELECT
			COALESCE (MIN(tmp."rank"),(SELECT COALESCE(MAX("number"), 0) + 1 FROM my_table))
		FROM
			(SELECT "number", ROW_NUMBER() OVER(ORDER BY bal."number" ASC) AS "rank" FROM my_table AS bal) AS tmp
		WHERE
			tmp."number" != tmp."rank"
	);
END;
$$;


Но есть подозрение, что на больших таблицах будет тормозить. Может есть вариант по-лучше
...
Рейтинг: 0 / 0
15.03.2016, 08:36
    #39191898
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
sanringoчто на больших таблицах будет тормозить
их просто не делают с дырками. За всё надо платить.
...
Рейтинг: 0 / 0
15.03.2016, 10:57
    #39191993
Author the new one
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
sanringo,

А, позвольте спросить, зачем это вообще надо?
...
Рейтинг: 0 / 0
15.03.2016, 11:37
    #39192053
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
Author the new one,

У меня был случай, когда в биллинге нумерация инвойсов должна была быть непрерывной.
Крайне неприятное требование.
...
Рейтинг: 0 / 0
15.03.2016, 15:36
    #39192431
Author the new one
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
vyegorov,

Да, но очень странно, когда получается, что офомляли 1000-ый инвойс и вдруг следующий оказался 47-ым. Что-то тут не то.
...
Рейтинг: 0 / 0
15.03.2016, 16:38
    #39192530
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
Author the new one,

1. Это не в рамках одного клиента, а всей клиентской базы
2. Если вам пришёл счет за номером 1000, а потом (через месяц) 1100, то какая вам разница, что 5 номеров пропущено и надо было бы номер 1095 присваивать?
...
Рейтинг: 0 / 0
15.03.2016, 16:59
    #39192546
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
Author the new oneДа, но очень странно, когда получается, что офомляли 1000-ый инвойс и вдруг следующий оказался 47-ым. Что-то тут не то.
Дык эта... и чтобы такого вот не было, нас заставляли откатывать все счета после дырки, переставлять последовательность и генерить заново. Неприятно...
...
Рейтинг: 0 / 0
15.03.2016, 17:22
    #39192575
ОКТОГЕН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
vyegorovAuthor the new oneДа, но очень странно, когда получается, что офомляли 1000-ый инвойс и вдруг следующий оказался 47-ым. Что-то тут не то.
Дык эта... и чтобы такого вот не было, нас заставляли откатывать все счета после дырки, переставлять последовательность и генерить заново. Неприятно...
То есть и во всех документах, накладных и т.п., что в электронном виде хранятся?
...
Рейтинг: 0 / 0
15.03.2016, 17:49
    #39192602
Author the new one
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
vyegorov,

Это что же, я, стало быть, закажу себе перчатки резиновые 50 шт, получу счет №9931, а потом окажется, что счет №9931 - это уже не перчатки, а фаллоимитаторы, и не 50 шт, а 4 тысячи?
...
Рейтинг: 0 / 0
15.03.2016, 19:31
    #39192674
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
Author the new one,

Это не магазин, а провайдер, который выписывает счета.
Нестыковки ищутся до отсылки счетов клиентам на стадии проверок. Если пропустили — то просто всем в тык.

После того, как счёт доставлен (в магазине это сразу), то понятно что ничего никуда не двигается.
...
Рейтинг: 0 / 0
16.03.2016, 10:26
    #39192988
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
vyegorovКрайне неприятное требование
главное знать кто эти дырки проверяет)).
А то ведь, и номера паспортов без дырок делать будут.))
...
Рейтинг: 0 / 0
16.03.2016, 16:54
    #39193530
Author the new one
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
vyegorov,

Так, может быть, проще перенумеровать их один раз при отправке и запретить модификации после?
...
Рейтинг: 0 / 0
16.03.2016, 17:24
    #39193585
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
Author the new one,

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

Ну да это всё уже не моя забота :)
...
Рейтинг: 0 / 0
16.03.2016, 18:16
    #39193682
Author the new one
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка минимальное незанятого числа
vyegorov,

Ну это как-то странно, придумали какую-то херню и теперь вы с ней долбитесь :-)
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вставка минимальное незанятого числа / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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