これまでは、テーブルの構造を変更する場合、いったん削除して再度作成していた。
その場合、当然データも全て消えてしまう。
既存のデータを残したままテーブルの構造を変更するには、ALTER TABLEを使用する。
・テーブル名の変更
ALTER TABLE 現テーブル名 RENAME TO 新テーブル名;
・列名の変更
ALTER TABLE テーブル名 RENAME 現列名 TO 新列名;
・列の追加
ALTER TABLE テーブル名 ADD [COLUMN} 列の定義;
・列の削除
ALTER TABLE テーブル名 DROP [COLUMN] 列名;
・テーブル制約の追加
ALTER TABLE テーブル名 ADD {制約 | CONSTRAINT 制約名 制約};
・テーブル制約の削除
ALTER TABLE テーブル名 DROP CONSTRAINT 制約名;
・NOT NULL制約の設定・削除
ALTER TABLE テーブル名 ALTER [COLUMN] 列名 {SET | DROP} NOT NULL;
・デフォルト値の設定・削除
ALTER TABLE テーブル名 ALTER [COLUMN] 列名 {SET DEFAULT デフォルト値 | DROP DEFAULT};
・列の型の変更
ALTER TABLE テーブル名 ALTER [COLUMN] 列名 TYPE 新しい型;
empテーブルを再度作成・行追加。
oddtbs=> \i emp_create042.sql ... oddtbs=> \i emp_insert011.sql ... oddtbs=> select * from emp; code | name | gender | age | tel --------+----------+--------+-----+--------- 564001 | 鈴木義男 | 1 | 58 | 11-1111 564002 | 斎藤洋子 | 2 | 44 | 22-2222 564003 | 山田美樹 | 2 | 33 | 33-3333 564004 | 田中秀明 | 1 | 35 | 44-4444 564005 | 佐藤研一 | 1 | 30 | 55-5555 564006 | 相原佳子 | 2 | 28 | 66-6666 564007 | 小林律子 | 2 | 33 | 77-7777 564008 | 吉田隆士 | 1 | 24 | 88-8888 (8 rows)
ALTER TABLEの実行。
oddtbs=> alter table emp add email text not null; ERROR: column "email" contains null values ※ 新しいemail列はNOT NULL制約つきだが、既存行の値がNULLとなってしまうためエラーとなる。 oddtbs=> alter table emp add email text; ALTER TABLE ※ とりあえずNOT NULLなしでemail列を追加。 oddtbs=> select * from emp; code | name | gender | age | tel | email --------+----------+--------+-----+---------+------- 564001 | 鈴木義男 | 1 | 58 | 11-1111 | 564002 | 斎藤洋子 | 2 | 44 | 22-2222 | 564003 | 山田美樹 | 2 | 33 | 33-3333 | 564004 | 田中秀明 | 1 | 35 | 44-4444 | 564005 | 佐藤研一 | 1 | 30 | 55-5555 | 564006 | 相原佳子 | 2 | 28 | 66-6666 | 564007 | 小林律子 | 2 | 33 | 77-7777 | 564008 | 吉田隆士 | 1 | 24 | 88-8888 | (8 rows) ※ email列は全行NULL。
email列に値を設定。
次のSQLをファイルとして作成。(emp_update041.sql)
oddtbs=> \i emp_update041.sql ... oddtbs=> select * from emp; code | name | gender | age | tel | email --------+----------+--------+-----+---------+------------------- 564001 | 鈴木義男 | 1 | 58 | 11-1111 | suzuki@aaa.com 564002 | 斎藤洋子 | 2 | 44 | 22-2222 | saito@bbb.com 564003 | 山田美樹 | 2 | 33 | 33-3333 | yamada@ccc.com 564004 | 田中秀明 | 1 | 35 | 44-4444 | tanaka@ddd.com 564005 | 佐藤研一 | 1 | 30 | 55-5555 | satoh@eee.com 564006 | 相原佳子 | 2 | 28 | 66-6666 | aihara@fff.com 564007 | 小林律子 | 2 | 33 | 77-7777 | kobayashi@ggg.com 564008 | 吉田隆士 | 1 | 24 | 88-8888 | yoshida@hhh.com (8 rows) ※ email列が全行設定された。
ALTER TABLEによってemail列にNOT NULL制約を設定し、tel列を削除。
oddtbs=> alter table emp alter email set not null; ALTER TABLE oddtbs=> alter table emp drop tel; ALTER TABLE oddtbs=> select * from emp; code | name | gender | age | email --------+----------+--------+-----+------------------- 564001 | 鈴木義男 | 1 | 58 | suzuki@aaa.com 564002 | 斎藤洋子 | 2 | 44 | saito@bbb.com 564003 | 山田美樹 | 2 | 33 | yamada@ccc.com 564004 | 田中秀明 | 1 | 35 | tanaka@ddd.com 564005 | 佐藤研一 | 1 | 30 | satoh@eee.com 564006 | 相原佳子 | 2 | 28 | aihara@fff.com 564007 | 小林律子 | 2 | 33 | kobayashi@ggg.com 564008 | 吉田隆士 | 1 | 24 | yoshida@hhh.com (8 rows) oddtbs=> insert into emp values(564009, 'aaa', 1, 40, null); ERROR: null value in column "email" violates not-null constraint ※ 新たに設定したNOT NULL制約により拒否された。 oddtbs=> alter table emp drop email; ALTER TABLE oddtbs=> select * from emp; code | name | gender | age --------+----------+--------+----- 564001 | 鈴木義男 | 1 | 58 564002 | 斎藤洋子 | 2 | 44 564003 | 山田美樹 | 2 | 33 564004 | 田中秀明 | 1 | 35 564005 | 佐藤研一 | 1 | 30 564006 | 相原佳子 | 2 | 28 564007 | 小林律子 | 2 | 33 564008 | 吉田隆士 | 1 | 24 (8 rows)
salary(給料)列を追加し、さらにage(年齢)と関係した前回同様の制約を追加する。
oddtbs=> alter table emp add salary integer; ALTER TABLE oddtbs=> select * from emp; code | name | gender | age | salary --------+----------+--------+-----+-------- 564001 | 鈴木義男 | 1 | 58 | 564002 | 斎藤洋子 | 2 | 44 | 564003 | 山田美樹 | 2 | 33 | 564004 | 田中秀明 | 1 | 35 | 564005 | 佐藤研一 | 1 | 30 | 564006 | 相原佳子 | 2 | 28 | 564007 | 小林律子 | 2 | 33 | 564008 | 吉田隆士 | 1 | 24 | (8 rows) oddtbs=> alter table emp add check(salary between age*10000 and age*20000); ALTER TABLE oddtbs=> insert into emp values(564009, '岡本太郎', 1, 40, 380000); ERROR: new row for relation "emp" violates check constraint "emp_check" ※ CHECK制約により拒否された。 oddtbs=> insert into emp values(564009, '岡本太郎', 1, 40, 420000); INSERT 0 1 ※ 今度はOK。 oddtbs=> select * from emp; code | name | gender | age | salary --------+----------+--------+-----+-------- 564001 | 鈴木義男 | 1 | 58 | 564002 | 斎藤洋子 | 2 | 44 | 564003 | 山田美樹 | 2 | 33 | 564004 | 田中秀明 | 1 | 35 | 564005 | 佐藤研一 | 1 | 30 | 564006 | 相原佳子 | 2 | 28 | 564007 | 小林律子 | 2 | 33 | 564008 | 吉田隆士 | 1 | 24 | 564009 | 岡本太郎 | 1 | 40 | 420000 (9 rows)