HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: postgresql, базы данных, postgres, изменение типа поля</p>
1 <p>Теги: postgresql, базы данных, postgres, изменение типа поля</p>
2 <p>На первый взгляд может показаться, что в<strong>PostgreSQL</strong>изменить тип поля можно очень просто, используя команду<strong>ALTER</strong>. Но это не всегда возможно. В качестве примера рассмотрим таблицу, в которой хранится список покупателей.</p>
2 <p>На первый взгляд может показаться, что в<strong>PostgreSQL</strong>изменить тип поля можно очень просто, используя команду<strong>ALTER</strong>. Но это не всегда возможно. В качестве примера рассмотрим таблицу, в которой хранится список покупателей.</p>
3 <p>Представьте, что в нашей таблице есть поле customer_id, где применяется строковый тип данных<strong>varchar</strong>. Налицо ошибка, ведь в этом поле предполагается хранить идентификаторы покупателей, имеющие целочисленный формат<strong>integer</strong>. Давайте попробуем исправить ошибку, используя ALTER:</p>
3 <p>Представьте, что в нашей таблице есть поле customer_id, где применяется строковый тип данных<strong>varchar</strong>. Налицо ошибка, ведь в этом поле предполагается хранить идентификаторы покупателей, имеющие целочисленный формат<strong>integer</strong>. Давайте попробуем исправить ошибку, используя ALTER:</p>
4 ALTER TABLE customers ALTER COLUMN customer_id TYPE integer;<p>Как некоторые уже догадались, ничего не выйдет:</p>
4 ALTER TABLE customers ALTER COLUMN customer_id TYPE integer;<p>Как некоторые уже догадались, ничего не выйдет:</p>
5 ERROR: column “customer_id” cannot be cast automatically to type integer SQL state: 42804 Hint: Specify a USING expression to perform the conversion.<p>А всё потому, что нельзя так просто взять и поменять тип поля,<strong>если в таблице содержатся данные</strong>. Так как применялся тип varchar, у PostgreSQL не получается определить принадлежность значения к integer.</p>
5 ERROR: column “customer_id” cannot be cast automatically to type integer SQL state: 42804 Hint: Specify a USING expression to perform the conversion.<p>А всё потому, что нельзя так просто взять и поменять тип поля,<strong>если в таблице содержатся данные</strong>. Так как применялся тип varchar, у PostgreSQL не получается определить принадлежность значения к integer.</p>
6 <p>Вопрос можно решить, используя<strong>USING</strong>- выражение, указанное в сообщении об ошибке. Так мы выполним преобразование данных в integer корректно:</p>
6 <p>Вопрос можно решить, используя<strong>USING</strong>- выражение, указанное в сообщении об ошибке. Так мы выполним преобразование данных в integer корректно:</p>
7 ALTER TABLE customers ALTER COLUMN customer_id TYPE integer USING (customer_id::integer);<p>В итоге всё пройдёт без сложностей:</p>
7 ALTER TABLE customers ALTER COLUMN customer_id TYPE integer USING (customer_id::integer);<p>В итоге всё пройдёт без сложностей:</p>
8 <h2>Что-нибудь ещё?</h2>
8 <h2>Что-нибудь ещё?</h2>
9 <p>Используя USING, мы можем кроме конкретного выражения применять функции, операторы, другие поля. К примеру, давайте выполним преобразование поля customer_id обратно в varchar, но уже преобразовав формат данных:</p>
9 <p>Используя USING, мы можем кроме конкретного выражения применять функции, операторы, другие поля. К примеру, давайте выполним преобразование поля customer_id обратно в varchar, но уже преобразовав формат данных:</p>
10 ALTER TABLE customers ALTER COLUMN customer_id TYPE varchar USING (customer_id || '-' || first_name);<p>В конечном итоге наша таблица будет выглядеть так:</p>
10 ALTER TABLE customers ALTER COLUMN customer_id TYPE varchar USING (customer_id || '-' || first_name);<p>В конечном итоге наша таблица будет выглядеть так:</p>
11 <p><a>Источник</a></p>
11 <p><a>Источник</a></p>
12  
12