Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088

Вставка строки не в конец таблицы

26.09.2017, 18:21. Показов 3435. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Руководство PostgreSQL пока не осилил. Хочется научиться вставлять строки, так чтобы id-шники после вставленной строки увеличились бы на 1, ну и после вставки при SELECTe всех записей id-шники отображались бы по порядку без ORDER.

Как быть? Просто писать запрос, который будет последовательно двигать строки начиная с последней?
Если вставить строку в конец таблицы и просто поменять id-шники нужным образом то эффект же будет другой?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.09.2017, 18:21
Ответы с готовыми решениями:

Возможна ли вставка новой записи в середину таблицы, а не добавление в конец?
Существует таблица - поле Счетчик и Текстовое поле (которое имеет хаотичные значение и сортировка его не имеет смысла). Записи отражаются в...

Вставка текста в конец строки между определенными словами
Помогите пожалуйста с задачей для Visual Basic. Задача такова, что нужно найти определенное слово (назовем его s1), затем в конец каждой...

Добавление строки в конец таблицы
Доброго времени суток. Вот код добавления строки в начало таблицы with StringGrid1 do begin RowCount:= RowCount+1; for i:= 0...

7
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,024
27.09.2017, 01:31
Цитата Сообщение от XRuZzz Посмотреть сообщение
отображались бы по порядку без ORDER.
в реляционных базах данных вообще и в postgresql в частности такого в принципе не предусмотрено. Порядок выдачи записей по запросу не гарантируется, пока не будет задан явный порядок ORDER BY.

а увеличение на 1 - это просто. используйте типы данных serial или bigserial. Будет вам поле, которое при вставке новой записи будет всегда увеличиваться на 1 (технически используется последовательность (create sequence), которая создается автоматически).
1
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
02.10.2017, 02:47  [ТС]
Я пока продолжу кормить своих тараканов:
SQL
1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE FUNCTION public.update_from_pred(nextid INTEGER)
  RETURNS INTEGER AS
$BODY$
BEGIN
    UPDATE domains SET (level, name)= 
    (SELECT level, name FROM domains AS dms WHERE id=nextid-1)
    WHERE id=nextid;
    RETURN 1;
END;
$BODY$
LANGUAGE plpgsql;
Вот думаю, как эту не самую удачную функцию, обобщить на любые таблицы...

Далее просто цикл, для функции выше:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE FUNCTION public.shift_rows(
    i_min INTEGER,
    i_max INTEGER)
  RETURNS void AS
$BODY$
BEGIN
FOR i IN REVERSE i_max..i_min LOOP
    PERFORM update_from_pred(i);
END LOOP;
RETURN;
END;
$BODY$
0
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,024
02.10.2017, 14:12
Не понимаю логики, что делается,
но обобщение для разных таблиц чаще всего делается динамическим SQL.
Примеры здесь

Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE FUNCTION PUBLIC.update_from_pred(tablename text, nextid INTEGER)
  RETURNS INTEGER AS
$BODY$
BEGIN
   EXECUTE 'UPDATE ' || tablename ||
                   ' SET (level, name)= (SELECT level, name FROM domains AS dms WHERE id=$1-1)
    WHERE id=$1' USING nextid;
    RETURN 1;
END;
$BODY$
LANGUAGE plpgsql;
1
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
02.10.2017, 16:53  [ТС]
Спасибо, но хочется сделать для любого количества разных полей...
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
05.10.2017, 12:11
Цитата Сообщение от XRuZzz Посмотреть сообщение
как эту не самую удачную функцию, обобщить на любые таблицы...
Я думаю, что этого не стоит делать в принципе. Если в таблице многие миллионы записей, я не завидую тому, кто решит часто использовать эту функцию. Поэтому развивать идею, ценность которой ноль целых хрен десятых не вижу никакого смысла
1
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
15.10.2017, 14:28  [ТС]
Доделал, идею взял тут:
Как выводить в запросе все столбцы кроме одного, не перечисляя их?
Код:
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
CREATE OR REPLACE FUNCTION except_col(tableName text, col text)
  RETURNS text AS
$BODY$
BEGIN
    RETURN ARRAY_TO_STRING(ARRAY(SELECT COLUMN_NAME::VARCHAR(50)
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = tableName AND COLUMN_NAME NOT IN (col) AND TABLE_SCHEMA NOT IN ('information_schema')
    ORDER BY ORDINAL_POSITION), ', ');
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
 
CREATE OR REPLACE FUNCTION update_from_pred(tableName TEXT, nextid INTEGER)
  RETURNS text AS
$BODY$
DECLARE
    li TEXT;
    se TEXT;
    sd TEXT;
    up TEXT;
BEGIN
    li = except_col(tableName, 'id');
    se = 'SELECT ' || li || ' FROM ' || tableName || ' WHERE id = ' || (nextid -1);
    up = 'UPDATE ' || tableName || ' SET (' || li || ') = (' || se || ') WHERE id = ' || nextid;
    RAISE NOTICE 'upd = %', up;
    EXECUTE up;
    RETURN 'Ok';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
 
CREATE OR REPLACE FUNCTION shift_rows(tableName TEXT, i1 INTEGER, i2 INTEGER)
  RETURNS void AS
$BODY$
BEGIN
FOR i IN REVERSE i2..i1 LOOP
    PERFORM update_from_pred(tableName, i);
END LOOP;
RETURN;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
16.10.2017, 09:18
Только это не будет работать в production из-за конкурентности.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.10.2017, 09:18
Помогаю со студенческими работами здесь

Добавление строки в конец таблицы
Есть табл <table id="game_list"> <tbody> <tr id="tr_1"> <td> Текст </td> </tr> </tbody> ...

Кнопка добавления пустой строки в конец таблицы
Всем доброго вечера. Почитал много тем на эту тему (простите за тавтологию), но нужной для себя не нашел пока. Если есть подобные -...

Вставка строки из одной таблицы в другую
Добрый день.Есть 2 таблицы со списком работников. Нужно сделать так, чтобы можно было нажать во второй таблице на строчку работника,...

Печать таблицы в отчете - как добавить в конец пустые строки?
Печатается таблица в отчете с какими-то данными и хочется в конце этой таблицы добавить ещё пустых разлинованных строк (чтобы люди от руки...

Вставка символа "конец строки"
Здравствуйте уважаемые обитатели форума! Помогите, пожалуйста, написать программу. нужно вставить chr(10) (конец строки) через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru