Несоответствие типов столбцов: изменение символов и изменение символов (30) - PullRequest
0 голосов
/ 01 февраля 2019

Для моего приложения я создал патч файла SQL для добавления столбца user_name в существующую таблицу:

CREATE OR REPLACE FUNCTION add_col(
  _tbl VARCHAR,  -- Table                                                                                                                                                                                      
  _col VARCHAR,  -- Column to add                                                                                                                                                                              
  _type regtype -- Type of that column                                                                                                                                                                         
) RETURNS BOOL AS $$
BEGIN
  -- Returns true if column has been added; false otherwise.                                                                                                                                                   
  IF EXISTS (SELECT DISTINCT column_name
             FROM information_schema.columns
             WHERE table_schema LIKE current_schema and table_name LIKE _tbl and column_name LIKE _col
            )
  THEN
     -- Column already exists in that table of that schema: do nothing.                                                                                                                                        
     RETURN false;
  END IF;

  -- Add column                                                                                                                                                                                                
  EXECUTE 'ALTER TABLE ' || _tbl || ' ADD COLUMN ' || _col || ' ' || _type;

  RETURN true;
END; $$ language 'plpgsql';

SELECT add_col('ack_event', 'user_name', 'VARCHAR(30)');

Если я выполню это и выполню SELECT для отображения содержимого ack_event, мы увидим, что столбецимя_пользователя добавляется, но с типом ", варьирующимся ":

| id     | user_name         |
| bigint | character varying |
|--------+-------------------+
|        |                   |

Однако, если столбец ack_event создается непосредственно со столбцом user_name, тип имени_пользователя будет равен " symbol_varying(30)":

CREATE TABLE ACK_EVENT(
    ID int8 not null,
    USER_NAME VARCHAR(30),

     CONSTRAINT PK_ACK_EVENT PRIMARY KEY (ID)
);

Результат:

| id     | user_name             |
| bigint | character varying(30) |
|--------+-----------------------+
|        |                       |

Почему это несоответствие?Есть ли способ исправить это и иметь различный характер (30) в обоих случаях?

1 Ответ

0 голосов
/ 01 февраля 2019

Это может вызвать некоторые проблемы с проверкой, но если вы измените тип данных _type с regtype на текстовый тип данных, я думаю, он введет ваш DDL гораздо более буквально:

CREATE OR REPLACE FUNCTION add_col(
  _tbl VARCHAR,
  _col VARCHAR,
  _type text -- this was previously regtype
) RETURNS varchar AS $$
...