SQLのカラム追加についてまとめています。
SQLのカラム追加はalter table。データベースエンジンにより一部の仕様が異なる
SQL カラム追加 MySQL
MySQLは、カラム追加関連の機能が他のデータベースエンジンより柔軟に拡張されています。
例えば、1つのalter table文で複数のカラムを一括追加することが可能です。
alter table employees_copy add dept_no char(4) NOT NULL after emp_no, add dept_name varchar(40) NOT NULL
【関連記事】
▶MySQLのカラム追加 サンプルコード集 一括で複数追加する方法は?
また、MySQLでは、テーブルの任意の位置にカラムを追加することが、ALTER TABLE文のみで可能です。
mysql> show columns from employees_copy; +------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------+------+-----+---------+-------+ | emp_no | int | NO | PRI | NULL | | | birth_date | date | NO | | NULL | | | first_name | varchar(14) | YES | | NULL | | | last_name | varchar(16) | NO | | NULL | | | gender | enum('M','F') | NO | | NULL | | | hire_date | date | NO | | NULL | | +------------+---------------+------+-----+---------+-------+ 6 rows in set (0.00 sec) alter table employees_copy add dept_no char(4) NOT NULL after emp_no; mysql> show columns from employees_copy; +------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------+------+-----+---------+-------+ | emp_no | int | NO | PRI | NULL | | | dept_no | char(4) | NO | | NULL | | | birth_date | date | NO | | NULL | | | first_name | varchar(14) | YES | | NULL | | | last_name | varchar(16) | NO | | NULL | | | gender | enum('M','F') | NO | | NULL | | | hire_date | date | NO | | NULL | | +------------+---------------+------+-----+---------+-------+ 7 rows in set (0.00 sec)
上記の例では、emp_noカラムの後ろにdept_noカラムを追加することができます。なお、カラムの1番目に追加したい場合は、after emp_noの箇所にfirstと指定します。
他のデータベースのカラム追加時の位置指定が軒並み不可。カラムの位置指定はMySQLの独自拡張のようですね。
SQL カラム追加 Oracle
CREATE TABLE t1 (name VARCHAR2(10)); INSERT INTO t1 VALUES('Kevin'); INSERT INTO t1 VALUES('Julia'); INSERT INTO t1 VALUES('Ryan'); ALTER TABLE t1 ADD (id NUMBER DEFAULT ON NULL s1.NEXTVAL NOT NULL); SELECT id, name FROM t1 ORDER BY id; ID NAME ---------- ---------- 1 Kevin 2 Julia 3 Ryan
Oracleでは、任意の位置にカラム列を追加することはできません。テーブル再生成し、データを移し替えるといった手順が必要になります。制約が設定してある場合は、設定も全て移し替えることになり非常にめんどう。
SQL カラム追加 SQL Server
CREATE TABLE dbo.doc_exc (column_a INT) ; GO ALTER TABLE dbo.doc_exc ADD column_b VARCHAR(20) NULL CONSTRAINT exb_unique UNIQUE ; GO EXEC sp_help doc_exc ; GO DROP TABLE dbo.doc_exc ; GO
ALTER TABLE (Transact-SQL) – SQL Server | Microsoft Docs
なお、SQL Serverでは、カラムを任意の位置に追加する方法は用意されていません。テーブル再作成後に、他のテーブルとの依存関係(フォーリンキーなど)を解消後にデータを移すという手順になります。
SQL カラム追加 postgreSQL
ALTER TABLE products ADD COLUMN description text; ALTER TABLE products ADD COLUMN description text CHECK (description <> '');
postgresSQLは、任意の位置にカラム追加する方法がありません。postgres公式のwikiによると、目的のカラムの並びになるようテーブル全体を再作成してからデータを写し、古いテーブルを削除するという方法が紹介されていました。
関連)Alter column position/ja – PostgreSQL wiki
しかし、他のテーブルからなんらかの依存関係が設定されていた場合を考慮すると簡単にはできないケースもあります。その場合は、データベース全体を再作成することになります。
postgreSQLでは、テーブルへのカラム追加で位置を指定するのはかなり大掛かりになることを覚えておきましょう。
2020年の最新版でも位置指定ができない点を見ると、なんらかのポリシーに従って位置指定不可の仕様になっていると思われます。
まとめ
- SQLのカラム追加はalter table
- MySQLは、複数カラムの一括追加と、カラムの追加位置指定が可能
- MySQL以外は、追加カラムの位置指定をおこなうためにテーブルの再生成とデータの移行が必要