Для моего приложения я создал патч файла 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) в обоих случаях?