はじめに

既存テーブルのカラムのデータ型を変更しようとした際に、エラーが発生することがあります。
今回の記事では、そのエラーが該当カラムに制約が付いていることが原因で発生した場合について、解決方法を紹介します。

PRIMARY KEY制約に起因した場合

PRIMARY KEY制約の付いたカラムに対して、データ型のサイズを変更しようとすると、以下のようなエラーが発生します。



対処

該当のカラムからPRIMARY KEY制約を一旦外し、データ型のサイズを変更します。
その後に再度PRIMARY KEY制約を設定することで解決することができます。
以下にSQLコマンドを交えて対処方法を紹介します。

制約名を確認するには、以下のSQLを使用します。



FOREIGN KEY制約に起因した場合

FOREIGN KEY制約の付いたカラムに対して、データ型のサイズを変更しようとすると、以下のようなエラーが発生します。



対処

該当のカラムからFOREIGN KEY制約を一旦外し、データ型のサイズを変更します。
その後に再度FOREIGN KEY制約を設定することで解決することができます。
以下にSQLコマンドを交えて対処方法を紹介します。

制約名を確認するには、以下のSQLを使用します。




UNIQUE制約に起因した場合

UNIQUE制約の付いたカラムに対して、データ型のサイズを変更しようとすると、以下のようなエラーが発生します。



対処


該当のカラムからUNIQUE制約を一旦外し、データ型のサイズを変更します。
その後に再度UNIQUE制約を設定することで解決することができます。
以下にSQLコマンドを交えて対処方法を紹介します。

制約名を確認するには、以下のSQLを使用します。



CHECK制約に起因した場合


UNIQUE制約の付いたカラムに対して、データ型のサイズを変更しようとすると、以下のようなエラーが発生します。


対処

該当のカラムからCHECK制約を一旦外し、データ型のサイズを変更します。
その後に再度CEHCK制約を設定することで解決することができます。
以下にSQLコマンドを交えて対処方法を紹介します。

制約名を確認するには、以下のSQLを使用します。





DEFAULT制約に起因した場合


DEFAULT制約の付いたカラムに対して、データ型のサイズを変更しようとすると、以下のようなエラーが発生します。
Vertica 9.0では当エラーは発生することなくデータ型のサイズを変更することが可能です。


対処

該当のカラムからDEFAULT制約を一旦外し、データ型を変更します。
その後に再度DEFAULT制約を設定することで解決することができます。
以下にSQLコマンドを交えて対処方法を紹介します。



セグメンテーションキーに起因した場合

プロジェクションのセグメンテーションキーとして参照されているカラムに対して、データ型のサイズを変更しようとすると、以下のようなエラーが発生します。



プロジェクションのセグメンテーションキーとは・・・
プロジェクションを作成する際に使われるもので、データ分散を行う際にキーとなるカラムが指定されます。
Verticaシステムを複数のノードで構成した場合に、データは複数のノードで分散して持たせます。
データの分散方法として、セグメンテーションとレプリケーションの2つの方法があります。
セグメンテーションとレプリケーションの違いについては、以下の記事をご参照ください。

セグメンテーションとレプリケーションの概要
http://vertica-tech.ashisuto.co.jp/segmentation_replication_overview/

今回エラーはセグメンテーションに関連した問題です。
プロジェクションを作成する際、以下のようなCREATE PROJECTION文が発行されます。
その中に、SEGMENTED BY句で指定されたカラムがあります。(★印の箇所)
これは、指定したカラムが持つデータをハッシュ関数を使ってデータを分散することを意味します。


従って、データ型を変更しようとするカラムがSEGMENTED BY句で指定されていると、
そのSQLはエラーになってしまいます。
このような場合は、以下のいずれかの方法で対処が可能です。

対処

①テーブルを再作成する
②カラムのデータ型変更後のテーブルを別途作成し、既存テーブルと置き換える方法

①はシンプルな方法ですが、テーブルが存在しなくなる期間が生じてしまうため、サービスへの影響が出る可能性があります。
②は少々複雑な手順が必要になりますが、サービスへの影響を最小限に留められるメリットがあります。
対処方法として、②の方法について例を紹介します。



テーブルのリネームについては、以下の記事をご参照ください。

テーブルのRENAMEコマンド
http://vertica-tech.ashisuto.co.jp/table_rename/


検証バージョンについて

この記事の内容はVertica 9.0で確認しています。