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

type + enum

05.02.2024, 14:28. Показов 1158. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Есть такой скрипт
SQL
1
2
3
4
5
CREATE TABLE test1.myTable1 ("name" VARCHAR(20), CHECK("name" IN ('a', 'b')));
 
INSERT INTO test1.myTable1 VALUES ('a');
INSERT INTO test1.myTable1 VALUES ('b');
INSERT INTO test1.myTable1 VALUES ('c'); --Ошибка!
Исходя документации PostgreSQL можно написать по другому, хотя это более правильно.
SQL
1
2
3
4
5
6
CREATE TYPE test1.enum_names AS enum ('a', 'b');
CREATE TABLE test1.myTable1 ("name" test1.enum_names);
 
INSERT INTO test1.myTable1 VALUES ('a');
INSERT INTO test1.myTable1 VALUES ('b');
INSERT INTO test1.myTable1 VALUES ('c'); --Ошибка!
Только во втором варианте не задается тип varchar(20) как в первом варианте.

Так нельзя писать
SQL
1
CREATE TYPE test1.enum_names AS enum ('a'::VARCHAR(20), 'b');
Скажите, во втором варианте можно конкретный тип задать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.02.2024, 14:28
Ответы с готовыми решениями:

ENUM
Подскажите что тут не так, почему тип не меняется? CREATE TYPE moodstatus AS ENUM ('ord', 'cancel'); ALTER TABLE orders ALTER COLUMN...

CheckConstraint и поле ENUM
1. Можно ли в ENUM-поле использовать nullable=True? 2. В таблице два поля, должно быть заполнено только одно из них, это корректное...

Выгодно ли хранить значения в ENUM?
Добрый день! Подскажите как лучше организовать базу данных. У меня есть таблица Users и в одной колонке этой таблицы нужно хранить какой-то...

10
55 / 50 / 5
Регистрация: 30.06.2022
Сообщений: 251
06.02.2024, 13:59
Цитата Сообщение от MConst Посмотреть сообщение
::VARCHAR(20)
с какой целью это преобразование введено?
0
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,024
07.02.2024, 23:37
Такой тип задать нельзя. Все метки пользовательских типов enum хранятся в системном каталоге pg_enum и имеют тип name. Этот тип внутренний, не для прямого использования, но его при желании можно кастить к text.
(тут подробнее: https://www.postgresql.org/doc... -enum.html)
1
55 / 50 / 5
Регистрация: 30.06.2022
Сообщений: 251
08.02.2024, 14:00
Цитата Сообщение от grgdvo Посмотреть сообщение
Такой тип задать нельзя. Все метки пользовательских типов enum хранятся в системном каталоге pg_enum и имеют тип name. Этот тип внутренний, не для прямого использования, но его при желании можно кастить к text.
(тут подробнее: https://www.postgresql.org/doc... -enum.html)
Это-то понятно. Просто хотелось бы в общих чертах понять, что автор хотел сделать и самое главное зачем?
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
21.02.2024, 13:04  [ТС]
Цитата Сообщение от MConst Посмотреть сообщение
SQL
1
CREATE TABLE test1.myTable1 ("name" VARCHAR(20), CHECK("name" IN ('a', 'b')));
SQL
1
2
CREATE TYPE test1.enum_names AS enum ('a', 'b');
CREATE TABLE test1.myTable1 ("name" test1.enum_names);
Скажите, в каком варианте ограничение сильнее влияет на производительность (при insert/update)?
0
55 / 50 / 5
Регистрация: 30.06.2022
Сообщений: 251
21.02.2024, 13:07
Цитата Сообщение от MConst Посмотреть сообщение
Скажите, в каком варианте ограничение сильнее влияет на производительность (при insert/update)?
Второй вариант занимает значительно меньше места. Соответственно, операции. Быстрее будет он.
1
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
21.02.2024, 13:48  [ТС]
Еще пример
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
--Вариант 1 
DROP TABLE IF EXISTS test1.myTable3;
CREATE TABLE test1.myTable3 ("isPromo" SMALLINT NULL CHECK (("isPromo" = 0) OR ("isPromo" = 1)));
INSERT INTO test1.myTable3 VALUES (0);
INSERT INTO test1.myTable3 VALUES (1);
 
--Вариант 2 
DROP TYPE IF EXISTS test1.enum_values;
CREATE TYPE test1.enum_values AS enum (0, 1); --Ошибка
 
DROP TABLE IF EXISTS test1.myTable4;
CREATE TABLE test1.myTable4 ("isPromo" test1.enum_values);
INSERT INTO test1.myTable4 VALUES (0);
INSERT INTO test1.myTable4 VALUES (1);
Специально не используется тип boolean, так как мигрируется из MS SQL тип BIT. Второй вариант не будет работать. И еще null в enum не задашь.

Скажите, как можно по другому написать?
0
55 / 50 / 5
Регистрация: 30.06.2022
Сообщений: 251
21.02.2024, 13:59
Биты в postgresql есть
SQL
1
CREATE TABLE test (a BIT(3), b BIT VARYING(5));
Строки переменной и постоянной длинны
https://postgrespro.ru/docs/po... tatype-bit
Цитата Сообщение от MConst Посмотреть сообщение
И еще null в enum не задашь.
В таблицу записывай как
SQL
1
2
INSERT INTO  test1.myTable4 ("isPromo")
VALUES(NULL::test1.enum_values);
NULL::BIT тоже можно вставлять и манипулировать.
1
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
21.02.2024, 14:30  [ТС]
Получается так
SQL
1
2
3
4
5
CREATE TABLE test1.myTable4 ("isPromo" bit(1));
INSERT INTO test1.myTable4 VALUES (0::bit); --По другому (B'0');
INSERT INTO test1.myTable4 VALUES (1::bit); --По другому (B'1');
INSERT INTO test1.myTable4 VALUES (2::bit); --По другому (B'2') --Не ругается;
INSERT INTO test1.myTable4 VALUES (NULL::bit); --По другому ?;
Цитата Сообщение от oktogen Посмотреть сообщение
В таблицу записывай как
SQL
1
2
INSERT INTO  test1.myTable4 ("isPromo")
VALUES(NULL::test1.enum_values);
NULL::BIT тоже можно вставлять и манипулировать.
SQL
1
2
3
4
5
6
CREATE TYPE test1.enum_values AS enum ('0', '1'); 
 
CREATE TABLE test1.myTable6 ("isPromo" bit(1));
INSERT INTO test1.myTable6 VALUES (0::test1.enum_values);
INSERT INTO test1.myTable6 VALUES (1::test1.enum_values);
INSERT INTO test1.myTable6 VALUES (NULL::test1.enum_values);
Не работает так.
0
55 / 50 / 5
Регистрация: 30.06.2022
Сообщений: 251
21.02.2024, 14:36
SQL
1
2
3
INSERT INTO test1.myTable6("isPromo") VALUES (1::BIT(1));
INSERT INTO test1.myTable6("isPromo") VALUES (0::BIT(1)); 
INSERT INTO test1.myTable6("isPromo") VALUES (NULL::BIT(1));
1
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
21.02.2024, 15:31  [ТС]
SQL
1
2
3
4
5
6
7
8
CREATE TABLE test1.myTable1
(
    "column1" VARCHAR(50) NULL,
    "column2" VARCHAR(480) NULL,
    "column3" SMALLINT CHECK NULL (("column3" = 0) OR ("column3" = 1)),
    "column4" SMALLINT CHECK NULL (("column4" = 0) OR ("column4" = 1)),
    "column5" SMALLINT CHECK NULL (("column5" = 0) OR ("column5" = 1))
);
Как понимаю такие проверки будут сильно замедлять, особенно при добавлении и обновлении свыше 1000 строк.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.02.2024, 15:31
Помогаю со студенческими работами здесь

Ошибка could not convert variant of type null into type string
вот есть ХП ALTER PROCEDURE . (@firmP varchar(50), @name_tovar varchar(50) output, @cen_tovara money output, @obm int output, @sum_post...

Uld not convert variant of type (unicodestring) into type (double)
Добрый день! Не могу разобраться... Толи лыжи не едут, то ли я... Вообщем, таблица в MSSQL, поле ('Дата регистрации') было datatime,...

Could not convert variant of type (null) to type (double)
Добрый день! Выручайте... не пойму что не так... База MSSQl, поля имеют тип (nvarchar(MAX)), NULL разрешен... with Form_Main do ...

Cannot drop or replace a type with type or table dependents
Привет . Борюсь с ошибкой CREATE OR REPLACE TYPE person_typ AS OBJECT ( name VARCHAR2(30) ) NOT FINAL / CREATE TYPE...

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value
Пытаюсь заполнить таблицу базы данных: USE CommercialNetworkSkript GO INSERT INTO Товар VALUES...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru