Модификация таблиц
Общие сведения
Для модификации таблица используется при изменении структуры таблицы, например изменение ограничения, типа данных атрибута, добавление или удаление атрибутов, добавление внешних ключей
Добавить столбец:
ALTER TABLE airports_data ADD COLUMN speed integer NOT NULL CHECK( speed >= 300 );
Так как в таблице строки уже существуют, команда выдаст ошибку, так как есть ограничение NOT NULL. В таком случае есть смысл, сначала добавить колонку без ограничений, затем значения для данной колонки, только потом ограничения:
#Добавить атрибут
ALTER TABLE aircrafts ADD COLUMN speed integer;
#Изменить значения атрибута speed
UPDATE aircrafts SET speed = 786 WHERE aircraft_code = 'CR2';
UPDATE aircrafts SET speed = 341 WHERE aircraft_code = 'CN1';
UPDATE aircrafts SET speed = 830 WHERE aircraft_code = 'SU9';
.....
.....
#Добавить ограничения
ALTER TABLE aircrafts ALTER COLUMN speed SET NOT NULL;
ALTER TABLE aircrafts ADD CHECK( speed >= 300 );
Удалить ограничения:
ALTER TABLE aircrafts ALTER COLUMN speed DROP NOT NULL;
ALTER TABLE aircrafts DROP CONSTRAINT aircrafts_speed_check;
Для удаления ограничения типа CHECK, необходимо указывать имя ограничения, которое можно выяснить с помощью команды \d name_table
Удалить столбец:
ALTER TABLE aircrafts DROP COLUMN speed;
Изменение типа данных:
ALTER TABLE airports ALTER COLUMN longitude SET DATA TYPE numeric( 5,2 ) ;
Допустим необходимо изменить в таблице seats для fare_conditions тип char на integer и в зависимости от значения выставить код в формате int, для этого:
demo=# ALTER TABLE seats
DROP CONSTRAINT seats_fare_conditions_check ,
ALTER COLUMN fare_conditions SET DATA TYPE integer
USING ( CASE WHEN fare_conditions = 'Economy' THEN 1
WHEN fare_conditions = 'Business' THEN 2
ELSE 3 END
);
В данном примере, прежде чем менять тип, было удалено ограничение для данного атрибута
Далее необходимо связать две таблицы с одинаковым атрибутом, т.е. создается внешний ключ:
demo=# ALTER TABLE seats
ADD FOREIGN KEY ( fare_conditions )
REFERENCES fare_conditions ( fare_conditions_code );
Ссылочная таблица:
demo=# \d fare_conditions
Table "bookings.fare_conditions"
Column | Type | Collation | Nullable | Default
----------------------+-----------------------+-----------+----------+---------
fare_conditions_code | integer | | not null |
fare_conditions_name | character varying(10) | | not null |
Indexes:
"fare_conditions_pkey" PRIMARY KEY, btree (fare_conditions_code)
Referenced by:
TABLE "seats" CONSTRAINT "seats_fare_conditions_fkey" FOREIGN KEY (fare_conditions) REFERENCES fare_conditions(fare_conditions_code)
demo=#
Изменение имени атрибута:
demo=# ALTER TABLE seats
RENAME COLUMN fare_conditions TO fare_conditions_code ;
Также необходимо изменить имя внешнего ключа для данного атрибута:
demo=# ALTER TABLE seats
RENAME CONSTRAINT seats_fare_conditions_fkey
TO seats_fare_conditions_code_fkey ;
Добавить ограничение UNIQUE для атрибута:
demo=# alter table fare_conditions add unique ( fare_conditions_name ) ;
ALTER TABLE
demo=#
Добавить ограничение
Допустим необходимо добавить в таблицу progress ограничение для атрибута test_form
ALTER TABLE progress
ADD CHECK (
( test_form = 'экзамен' AND mark IN ( 3, 4, 5 ) )
OR
( test_form = 'зачет' AND mark IN ( 0, 1 ) )
);
В данном случае для атрибута test_form возможны только два значения 'экзамен' или 'зачет' и для каждого значения в атрибуте mark используется свой набор допустимых оценок
Источники
Связанные темы
Оптимизация запросов в Postgresql
Установка и настройка MS SQL Server 2008 на Windows Server 2008 r
Системный каталог в Postgresql
Табличные пространства в Postgresql
Определение данных в Postgresql
Изменение временной зоны в Postgresql
Основные команды psql и sql Postgresql
Методы формирования соединений наборов строк
Агрегирование и группировка в Postgresql