Какой тип «ИЗОБРАЖЕНИЯ» в Postgres?

#postgresql

#postgresql

Вопрос:

Случайно (перепутав порядок параметров), я установил тип столбца IMAGE в моем экземпляре postgres), и это сработало (не выдало ошибку)! Я понятия не имею, что это за тип, и он не указан в официальной таблице типов.

 mydb=# CREATE TABLE tmp_image( image_column image );
CREATE TABLE
mydb=# d tmp_image 
               Table "public.tmp_image"
    Column    | Type  | Collation | Nullable | Default 
-------------- ------- ----------- ---------- ---------
 image_column | image |           |          | 
  

Немного поискав, я нашел вызываемое расширение postgres pg_image , но у меня не установлено никаких расширений:

  dx
                 List of installed extensions
  Name   | Version |   Schema   |         Description          
--------- --------- ------------ ------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
  

Кажется, я запускаю 10.7 ( psql (PostgreSQL) 10.7 (Ubuntu 10.7-0ubuntu0.18.04.1) ).

Комментарии:

1. У вас есть таблица с именем image ?

2. Может быть, домен ? Вы можете проверить с помощью dD

3. @stickybit Да, есть представление под названием Image . Как это связано с типами?

4. Таблица или представление также являются типом.

5. Странно, но нормально 🙂

Ответ №1:

Вы создали составной тип (случайно?). Из документов:

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

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

 postgres=# CREATE TABLE test (id int, data text);
CREATE TABLE

postgres=# CREATE TABLE test2 (id int, field test); -- note the type of [field]
CREATE TABLE

postgres=# INSERT INTO test2 (id, field) VALUES (2, ROW(1, 'test'));
INSERT 0 1

postgres=# SELECT * FROM test2;
 id | field 
---- -------
  2 | (1,test)
(1 row)

postgres=# SELECT (field).data FROM test2;
 data 
------
 test
(1 row)

postgres=# SELECT * FROM test;
 id 
----
(0 rows)
  

Обратите внимание, как test становится частью test2 . Это не внешняя ссылка.