Добавление нового значения к существующему ПЕРЕЧИСЛИМОМУ Типу

PHP preg функции нужен Ваш regex, который будет обернут с символом-разделителем, который может быть любым символом. Вы не можете использовать этот символ-разделитель, не выходя в regex. Это должно работать (здесь, символ-разделитель/):

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

// or this, to allow matching 0:00:00 time too.
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

, Если необходимо соответствовать строкам, которые содержат только дату и время, добавьте ^ и $ вначале и конец regex.

preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45');

Ссылка на preg_match Руководства PHP ()

178
задан Robin Daugherty 22 February 2019 в 18:21
поделиться

3 ответа

ПРИМЕЧАНИЕ , если вы используете PostgreSQL 9.1 или новее и можете вносить изменения вне транзакции, см. этот ответ для более простого подхода.


У меня была такая же проблема несколько дней назад, и я нашел этот пост. Так что мой ответ может быть полезен для тех, кто ищет решение :)

Если у вас есть только один или два столбца, в которых используется тип перечисления, который вы хотите изменить, вы можете попробовать это. Также вы можете изменить порядок значений в новом типе.

-- 1. rename the enum type you want to change
alter type some_enum_type rename to _some_enum_type;
-- 2. create new type
create type some_enum_type as enum ('old', 'values', 'and', 'new', 'ones');
-- 3. rename column(s) which uses our enum type
alter table some_table rename column some_column to _some_column;
-- 4. add new column of new type
alter table some_table add some_column some_enum_type not null default 'new';
-- 5. copy values to the new column
update some_table set some_column = _some_column::text::some_enum_type;
-- 6. remove old column and type
alter table some_table drop column _some_column;
drop type _some_enum_type;

3-6 следует повторить, если столбцов больше 1.

137
ответ дан 23 November 2019 в 20:13
поделиться

Самый простой: избавиться от перечислений. Их нелегко изменить, и поэтому их следует очень редко использовать.

2
ответ дан 23 November 2019 в 20:13
поделиться

Заявление об ограничении ответственности: Я не пробовал это решение, поэтому оно может не сработать; -)

Вы должны посмотреть pg_enum . Если вы хотите изменить только метку существующего ENUM, это сделает простое UPDATE.

Чтобы добавить новые значения ENUM:

  • Сначала вставьте новое значение в pg_enum . Если новое значение должно быть последним, все готово.
  • Если нет (вам нужно новое значение ENUM между существующими), вам придется обновить каждое отдельное значение в вашей таблице, начиная с от верхнего к нижнему ...
  • Затем вам просто нужно переименовать их в pg_enum в обратном порядке.

Иллюстрация
У вас есть следующий набор меток:

ENUM ('enum1', 'enum2', 'enum3')

и вы хотите получить:

ENUM ('enum1', 'enum1b', 'enum2', 'enum3')

затем:

INSERT INTO pg_enum (OID, 'newenum3');
UPDATE TABLE SET enumvalue TO 'newenum3' WHERE enumvalue='enum3';
UPDATE TABLE SET enumvalue TO 'enum3' WHERE enumvalue='enum2';

затем:

UPDATE TABLE pg_enum SET name='enum1b' WHERE name='enum2' AND enumtypid=OID;

И так далее ...

7
ответ дан 23 November 2019 в 20:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: