ALTER TABLE 表名 { ADD COLUMN 列定義 | ADD CONSTRAINT節 | DROP [ COLUMN ] 列名 [ CASCADE | RESTRICT ] DROP { PRIMARY KEY | FOREIGN KEY 制約名 | UNIQUE 制約名 | CHECK 制約名 | CONSTRAINT 制約名 } ALTER [ COLUMN ] 列定義変更 | LOCKSIZE { ROW | TABLE } }
列名 SET DATA TYPE VARCHAR(integer) | column-name SET INCREMENT BY 定整数 | column-name RESTART WITH 定整数 | column-name [ NOT ] NULL | column-name [ WITH ] DEFAULT 既定値
列定義変更のSET INCREMENT BY 定整数により、識別子列のとる連続した値の間隔が設定されます。識別子列がとる次の値は、最後にとられた値に増分が加算された値となります。この場合列にはあらかじめIDENTITY属性が定義されていなければなりません。
CREATE TABLE tauto(i INT GENERATED BY DEFAULT AS IDENTITY, k INT) CREATE UNIQUE INDEX tautoInd ON tauto(i) INSERT INTO tauto(k) values 1,2
INSERT INTO tauto VALUES (3,3) INSERT INTO tauto VALUES (4,4) INSERT INTO tauto VALUES (5,5)
ALTER TABLE tauto ALTER COLUMN i RESTART WITH 6
ALTER TABLE は表を参照するいかなるビューにも影響しません。これはSELECT一覧に"*"を持っていても然りです。新しく追加された列がビューから見えるようにする為には、ビューを破棄して作り直さなければなりません。
追加する列の列定義は、構文の上でCREATE TABLE文の列と同じです。ですから、列の制約をALTER TABLE ADD COLUMN文の新しい列に書くこともできます。しかしながら、既存のテーブルにNOT NULL制約のある列を追加することは、その列に既定値を与えた場合のみ可能です。さもなければ、ALTER TABLE文が実行されたとき、例外が発生します。
CREATE TABLEと同様、列定義に一意あるいは主キー制約がある場合、列はnull値をとることができません。したがって、NOT NULL属性も必要です。(SQLSTATE 42831)
ALTER TABLE ADD UNIQUEやPRIMARY KEYは、単一の列による主キーを定義する簡単な方法を提供します。もしPRIMARY KEYがCという列の定義に書かれたされた場合、これはPRIMARY KEY(C)という別の節に書いたのと同じです。列はnullの値をとってはならないので、NOT NULL属性も指定されなければなりません。
制約の構文についての詳細は、CONSTRAINT 節を読んでください。 ADD TABLE ADD CONSTRAINTという書き方にて、制約を追加する場合は、表毎の制約の構文に従ってください。
ALTER TABLE DROP COLUMNにより、表から列を破棄できます。
COLUMNというキーワードは無くてもかまいません。
CASCADEやRESTRICTも、無くてかまいません。どちらも指定しなかった場合、既定はCASCADEです。
RESTRICTの場合、依存しているスキーマの情報が無効になるならば、列の破棄は失敗します。
CASCADEの場合、列の破棄と併せて、無効になるスキーマの情報も破棄されます。
DROP COLUMN RESTRICTが失敗する原因となるスキーマの情報には、次が含まれます。 ビュー、トリガ、主キー制約、外部キー制約、一意キー制約、チェック制約、列権限。破棄する列に依存するいずれかの情報があれば、DROP COLUMN RESTRICTは失敗します。
表にひとつしかない列は、破棄することができません。
sqlAuthorizationが真である場合、列を削除することはできません。(DERBY-1909を参照してください。) )
列が索引にて使われているか否かにかかわらず、列の破棄はCASCADE/RESTRICTのどちらでも同じように行われます。列が破棄されるとき、索引にあるその列が取り除かれます。その列が索引にあるただひとつの列であった場合、索引全体が破棄されます。
ALTER TABLE DROP CONSTRAINTにより表の制約を破棄できます。名前付けしていない制約を破棄するためには、SYS.SYSCONSTRAINTSに記録されている自動生成された制約の名前をデリミトされた識別子として指定する必要があります。
主キー・一意性・外部キー制約を破棄すると、その制約が機能するために存在している索引が破棄されます。(この索引は支援索引とも呼ばれます。)
これらの列の幅を増やすためには、データ型と新しいサイズを列名の後に書きます。
列の幅を減らしたり、データ型を変更したりする事はできません。主キーの一部や、外部キー制約から参照されている一意キー、外部キー制約の一部である列の幅は変更できません。
識別子列のとる連続した値の間隔を設定するためには、定整数を与えます。あらかじめ列には識別子属性が与えられていなければなりません。(SQLSTATE 42837)もし表に既に行がある場合、列のSET INCREMENT defaultが加算された値は変更されません。
NOT NULL制約を既存の列に与えることができます。これを行う場合、既存のNULL値が表のその列に存在してはなりません。
NOT NULL制約を既存の列から取り除くことができます。これを行う場合、その列がPRIMARY KEYやUNIQUEの制約にて使われている列であってはなりません。
新規の列に既定値を与えることができます。既定値とは値が指定されなかった場合に列に挿入される値です。もし明示的に既定値が与えられていなかった場合、列の既定値はNULLです。もし新しい列に既定値を与えた場合、表にある既存の行はその新列に既定値をとることとなります。
既定値のより詳細な情報については、CREATE TABLE 文を参照してください。
もしあなたのシステムが既定の設定である行毎のロックを行うのであれば、LOCKSIZE節により表の行毎のロックを上書きすることができます。(一方あなたのシステムが表ごとのロックを行うよう設定されている場合、DerbyがLOCKSIZE節に対して例外を投げなかったとしても、ロックの粒度を行単位のロックに変更することはできません。) 表の行毎のロックを上書きするには、表にロックの設定を行います。 もし表が表毎のロックで作成された場合、ALTER TABLE文にてLOCKSIZE節を使うことで、その設定を行毎の設定に戻すことができます。これが便利な場合もあるのですが、その詳細については、Derbyのチューニングを参照してください。
-- 既存の表に列ごとの制約のある列を追加する。 -- 表に既存行があった場合、既存行の新列はNULLをとるので、 -- 例外が発生する。 ALTER TABLE CITIES ADD COLUMN REGION VARCHAR(26) CONSTRAINT NEW_CONSTRAINT CHECK (REGION IS NOT NULL); -- 既存の表に一意性制約を追加する。 -- 重複したキーがあった場合、例外が発生する。 ALTER TABLE SAMP.DEPARTMENT ADD CONSTRAINT NEW_UNIQUE UNIQUE (DEPTNO); -- Cities表に外部キー制約を追加する。 -- 行が制約を満たすか検証されて、 -- もし制約を満たさない行が見つかった場合、 -- 制約は追加されない。 ALTER TABLE CITIES ADD CONSTRAINT COUNTRY_FK Foreign Key (COUNTRY) REFERENCES COUNTRIES (COUNTRY); -- 主キー制約を表に追加する。 -- 最初に表が作成される。 CREATE TABLE ACTIVITIES (CITY_ID INT NOT NULL, SEASON CHAR(2), ACTIVITY VARCHAR(32) NOT NULL); -- もし主キーとした列にnullや重複した値がある場合、 -- この制約を追加することはできない。 ALTER TABLE Activities ADD PRIMARY KEY (city_id, activity); -- もし依存する情報が無ければ、city_id列が破棄される。 ALTER TABLE Cities DROP COLUMN city_id RESTRICT; -- 依存する情報と併せて、city_id列が破棄される。 ALTER TABLE Cities DROP COLUMN city_id CASCADE; -- CITIES表の主キー制約を破棄する。 ALTER TABLE Cities DROP CONSTRAINT Cities_PK; -- CITIES表の外部キー制約を破棄する。 ALTER TABLE Cities DROP CONSTRAINT COUNTRIES_FK; -- 既定値を1にとるDEPTNO列を追加する。 ALTER TABLE SAMP.EMP_ACT ADD COLUMN DEPTNO INT DEFAULT 1; -- VARCHAR型の列幅を増やす。 ALTER TABLE SAMP.EMP_PHOTO ALTER PHOTO_FORMAT SET DATA TYPE VARCHAR(30); -- 表のロック粒度を変更する。 ALTER TABLE SAMP.SALES LOCKSIZE TABLE; -- MANAGER列のNOT NULL制約を破棄する。 ALTER TABLE Employees ALTER COLUMN Manager NULL; -- SSN列にNOT NULL制約を追加する。 ALTER TABLE Employees ALTER COLUMN ssn NOT NULL; -- SALARY列の既定値を変更する。 ALTER TABLE Employees ALTER COLUMN Salary DEFAULT 1000.0
ALTER TABLE 文により変更する表に依存する全ての文は、次回の実行にて再コンパイルされます。もし変更する表を参照する、開いたカーソルがある場合、ALTER TABLEは許可されません。