Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
1 / 1 / 2
Регистрация: 17.03.2016
Сообщений: 234

Создание таблиц (использовать ли SERIAL)

06.11.2023, 14:41. Показов 998. Ответов 1

Студворк — интернет-сервис помощи студентам
(1) Привет. Есть скрипт для создания таблицы:

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
-- TABLES --
CREATE TABLE processed_file
(
    id                  VARCHAR(2048)                       NOT NULL     PRIMARY KEY,
    name                VARCHAR(2048)                       NOT NULL,
    completed           bool                                NOT NULL,
    active              bool                                NOT NULL,
    revision            int8                                NOT NULL,
    lastupdatedwhen     TIMESTAMP(6)                        NOT NULL,
    filetype            VARCHAR(64) DEFAULT 'REQUEST_TYPE'  NOT NULL,
    uploaded            int8,
    total               int8
);
 
-- COMMENTS --
comment ON COLUMN processed_file.revision IS 'ID редакции';
comment ON COLUMN processed_file.lastupdatedwhen IS 'timestamp последнего изменения записи';
comment ON COLUMN processed_file.active IS 'Признак неудаленной записи: true или false';
 
-- INDEXES --
CREATE INDEX processed_file_lastupdatedwhen ON processed_file (lastupdatedwhen);
 
-- SEQUENCES --
CREATE SEQUENCE processed_file_id_sq START 1;
CREATE SEQUENCE processed_file_rv_sq START 1;
Здесь, если я правильно понимаю, первичный ключ id формируется с помощью последовательности (sequence). При добавлении новой записи в таблицу, сначала в коде приложения получают очередное значение
последовательности nextId: select nextval('processed_file_id_sq')
А затем уже создают строку id: "PROCESSED_FILE-" + nextId
И поэтому в самой таблице в столбике id будут значения: PROCESSED_FILE-1, PROCESSED_FILE-2, и т.д.

Поэтому здесь у столбика id тип varchar(2048)

--------------------------------------------------------------------------------------------------

(2) Вот ещё команда на создание другой таблицы:

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
CREATE TABLE N_REQUEST_PARTICIPANT
(
    REQUEST_ID                VARCHAR(2000) NOT NULL,
    P_ARRAYINDEX              INTEGER,
    PARTICIPANT_INDUSTRY_NAME VARCHAR(2000),
    PARTICIPANT_INN           VARCHAR(2000),
    PARTICIPANT_SECURITY      VARCHAR(2000),
    PARTICIPANT_TYPE          VARCHAR(2000),
    P_BORROWER_PRIORITY       VARCHAR(2048),
    P_CRM_ID                  VARCHAR(2048),
    P_KG_ID                   VARCHAR(2048),
    P_FORM_OF_ENTITY          VARCHAR(2048),
    P_FULL_NAME               VARCHAR(2048),
    P_MACRO_INDUSTRY          VARCHAR(64),
    P_NAME                    VARCHAR(2048),
    P_SECTOR                  VARCHAR(64),
    P_SEGMENT                 VARCHAR(4000),
    P_SUB_INDUSTRY            VARCHAR(64),
    P_UCP_ID                  VARCHAR(4000),
 
    CONSTRAINT RP_REQUEST_ID_ARRAYINDEX_PK
        PRIMARY KEY (REQUEST_ID, P_ARRAYINDEX),
 
    CONSTRAINT RP_REQUEST_ID_FK
        FOREIGN KEY (REQUEST_ID) REFERENCES N_REQUEST (ID)
);
Здесь тоже столбик REQUEST_ID имеет тип VARCHAR(2000)
и его значения формируются аналогичным способом.

Примеры взяты из реального приложения.

При этом я прочитал, что в PostgreSQL существует тип SERIAL, который судя по всему для того и нужен, чтобы автоматически создавать SEQUENCE для генерации значений id.

У меня вопрос: я правильно понимаю, что в реальном приложении лучше всё-таки НЕ использовать тип SERIAL, а генерировать значения для id "вручную"? Для чего тогда был создан SERIAL ?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.11.2023, 14:41
Ответы с готовыми решениями:

Использовать или не использовать inner join для соединения таблиц
Привет всем! Очень спорная тема, и она наверно стара как мир, но все же хотелось бы узнать насколько эффективно использовать внутреннее...

Нужно из этих таблиц с помощью запроса "Создание таблиц" сделать новую таблицу
Даны таблицы, между собой не связаны. Нужно из этих таблиц с помощью запроса "Создание таблиц" сделать новую таблицу. Делаю все по...

Создание базы данных, создание таблиц в MS SQL Server из программы на C++ Builder 6.0
Здравствуйте. Не могу найти источника знаний по созданию базы данных в удалённом MS SQL Servere. В базе данных необходимо создать таблицы и...

1
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
07.11.2023, 08:23
Лучший ответ Сообщение было отмечено alex_7 как решение

Решение

Цитата Сообщение от alex_7 Посмотреть сообщение
Здесь, если я правильно понимаю, первичный ключ id формируется с помощью последовательности (sequence). При добавлении новой записи в таблицу, сначала в коде приложения получают очередное значение
последовательности nextId: select nextval('processed_file_id_sq')
А затем уже создают строку id: "PROCESSED_FILE-" + nextId
Да, правильно.

Цитата Сообщение от alex_7 Посмотреть сообщение
И поэтому в самой таблице в столбике id будут значения: PROCESSED_FILE-1, PROCESSED_FILE-2, и т.д.
Поэтому здесь у столбика id тип varchar(2048)
Нет, последовательность возвращает тип BigInt, то есть возвращается число, .... почему используется избыточное поле в 2К, думаю - это исторически так сложилось, сначала написали код, а потом переделывать не стали.

Цитата Сообщение от alex_7 Посмотреть сообщение
У меня вопрос: я правильно понимаю, что в реальном приложении лучше всё-таки НЕ использовать тип SERIAL, а генерировать значения для id "вручную"? Для чего тогда был создан SERIAL ?
Зависит от задачи, тип BigInt имеет значения от -9223372036854775808 до +9223372036854775807. Занимает 8 байт, а serial: представляет автоинкременное числовое значение, которое занимает 4 байта и может хранить числа от 1 до 2147483647.
То есть, если значения могут превысить 2147483647 надо выбирать не serial, а BigInt, вся разница. (ну размер ещё 4 и 8 байт и Null)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.11.2023, 08:23
Помогаю со студенческими работами здесь

Создание базы данных на лету, создание и заполнение таблиц в базе DB (Paradox? или..).
Здравствуйте Профи! --- Видел я "простенькую" (exe-шник небольшого размера, запускается сразу, без предварительной установки)...

Автоматическое создание таблиц из наименований таблиц, имен полей, типов полей
Форумчане, доброго времени суток! Есть таблица в которую автоматом выгрузили имена всех таблиц, полей, их тип (и запросов на выборку)...

Laravel Какой редактор таблиц использовать
Здравствуйте, какой лучше использоваться редактор таблиц? На чистом php пользовался datatables. На laravel что лучше использовать...

Как использовать 1 select для 2-х таблиц?
Всем привет! Есть 1 код select. Потом я добавил ещё 1 код select, но 2-ой не работает. Код 2-ого анологичен 1-ой. Поэтому решил...

Что использовать для редактора таблиц
Пишу на PHP свою "админку". И надо написать редактор одной (довольно большой) таблицы - аналог Екселя. Подскажите с чего начать? ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru