sql >> データベース >  >> RDS >> Database

初心者向けのSQLALTERTABLE

    SQLでは、ALTER TABLE ステートメントは、既存のテーブルの定義を変更します。

    ALTER TABLEを使用できます 列と制約を変更、追加、または削除します。

    DBMSによっては、ALTER TABLE ステートメントを使用して、パーティションを再割り当てして再構築したり、制約とトリガーを無効にして有効にしたりすることもできます。

    構文

    ALTER TABLE ステートメントは一般的に次のようになります:

    ALTER TABLE table_name
        [alter_option [, alter_option] ...]
        [partition_options]

    場所:

    • table_name 変更するテーブルの名前です。
    • [alter_option [, alter_option] …] 実行する特定の変更のリストです(たとえば、ADD その後に列名と定義、またはDROP COLUMNが続きます その後に列名などが続きます。
    • [partition_options] パーティションテーブル専用のオプションのオプションリストです。すべてのDBMSがパーティションテーブルをサポートしているわけではありません。その場合、そのようなオプションを使用すると、パーティションを追加、削除、破棄、インポート、マージ、または分割したり、パーティションのメンテナンスを実行したりできる場合があります。

    ALTER TABLEの完全な構文 非常に複雑になる可能性があり、DBMS間で大幅に異なります。この記事でカバーされていないものについては、DBMSのドキュメントを参照してください。

    以下は、最も一般的なALTER TABLEの例です。 オペレーション。

    新しい列を追加する

    テーブルに新しい列を追加するには、ADDを使用します 句の後に列名とデータ型が続きます。

    ALTER TABLE Products 
    ADD ProductDescription varchar(500);

    これにより、ProductDescriptionという新しい列が追加されます Productsへ テーブル。

    この例では、列をvarchar(500)にしました。 ただし、新しい列に適したデータ型を使用します。

    列定義に制約を含めることもできますが、これはDBMSと、テーブルにすでにデータが含まれているかどうかによって異なります(これについては以下の説明を参照してください)。

    列の名前を変更する

    ほとんどの主要なRDBMS(PostgreSQL、Oracle、SQLite、MySQL 8.0以降、MariaDB 10.5.2以降)では、次のように列の名前を変更できます。

    ALTER TABLE table_name 
    RENAME COLUMN column_name TO new_column_name;

    バージョン8.0より前のMySQL、または10.5.2以降より前のMariaDBを使用している場合は、CHANGE COLUMNを使用する必要があります。 代わりに構文。データ型を再指定する必要もあります。このように:

    ALTER TABLE table_name
    CHANGE COLUMN old_column_name new_column_name datatype;

    SQL Serverでは、sp_renameを使用する必要があります 列の名前を変更するためのストアドプロシージャ。このように:

    EXEC sp_rename 'schema_name.table_name.column_name', 'new_column_name', 'COLUMN';

    列を削除

    列を削除するには、DROP COLUMNを使用します 句の後に列名が続きます。

    ALTER TABLE table_name 
    DROP COLUMN column_name;

    列の定義を変更する

    既存の列の定義を変更するための構文は、DBMS間で大幅に異なります。また、どのような変更を加える必要があるかによっても異なります。

    簡単にするために、SQLServerの列に簡単な変更を加えましょう。

    ALTER TABLE Products 
    ALTER COLUMN ProductDescription varchar(1000);

    この例では、ProductDescriptionを変更しました varchar(500)の列 varchar(1000)へ 。

    以下に、同じまたは同様の変更を行うために各DBMSに必要な基本的な構文を示します。

    SQL Server:

    ALTER TABLE table_name 
    ALTER COLUMN column_name datatype;

    PostgreSQL:

    ALTER TABLE table_name 
    ALTER COLUMN column_name TYPE datatype;

    MySQL、MariaDB、および10gより前のOracle:

    ALTER TABLE table_name 
    MODIFY COLUMN column_name datatype;

    Oracle 10g以降の場合:

    ALTER TABLE table_name 
    MODIFY column_name datatype;

    SQLiteでは、名前を変更する以外に、列を変更することはできません。

    各DBMSの実際の構文は通常、これよりもはるかに複雑であり、何をしようとしているかによって異なります。ただし、これで基本的な列の変更を開始できます。

    制限と考慮事項

    通常、テーブルにデータが含まれている場合は、テーブルに変更を加えないようにする必要があります。変更を加えると、既存のデータが失われるリスクがあります。

    そうは言っても、多くのDBMSは、テーブルにデータが含まれると、実際には特定の変更を行うことができなくなります。たとえば、NOT NULLを追加できない場合があります。 データを含む列への制約。

    一部のDBMSでは、DEFAULTを使用している限り、これを実行できる場合があります。 制約(データが明示的に挿入されていない列のデフォルト値を提供するため)、ID /自動インクリメント列、タイムスタンプ列など。

    一部のDBMSでは、テーブルの列を削除または変更できません。

    また、一部のDBMSは、追加できるデータ型を制限しています。

    例–NOTNULL制約の追加

    上記のポイントを示すのに役立つ例を次に示します。

    NOT NULLで列を追加しようとするとどうなりますか SQLServerの制約。

    ALTER TABLE Products 
    ADD ProductDescription varchar(500) NOT NULL;

    結果:

    Msg 4901, Level 16, State 1, Line 1
    ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified, or the column being added is an identity or timestamp column, or alternatively if none of the previous conditions are satisfied the table must be empty to allow addition of this column. Column 'ProductDescription' cannot be added to non-empty table 'Products' because it does not satisfy these conditions.

    基本的に、テーブルにはすでにデータが含まれているため、SQLServerはNOT NULLしか追加できないというエラーを返します。 テーブルが特定の基準を満たし、まだその基準を満たしていない場合の制約。

    そして、その基準には正当な理由があります。

    NOT NULL 制約により、NULLがないことが保証されます 任意の行の列の値。問題は、テーブルにすでにデータがあり、新しい列を追加すると、それらの既存の行がNULLになることです。 –これはすぐにNOT NULLに違反します 制約。したがって、既存の行に移動するデータを指定する必要があります。

    これを行うには、DEFAULTを追加します 既存の行にこの列のデータが自動的に入力されるようにするための制約など。

    例:

    ALTER TABLE Products 
    ADD ProductDescription varchar(500) NOT NULL DEFAULT 'N/A';

    これは単にDEFAULTを追加するだけです 列への制約。この制約により、すべての行に値が含まれるようになります(この場合、値はN/Aです。 )値が割り当てられていない場合。これは、NOT NULLを意味します 既存のすべての行に値が含まれるようになるため、制約に違反することはありません。

    新しい列に一意の増分値が必要な場合は、代わりにIDENTITYにすることができます。 列(またはAUTOINCREMENT SQLiteおよびその他のDBMSで)。

    ただし、テーブルにまだデータが含まれていない場合は、これらの手順を実行しなくても列を追加できる可能性があります。

    パーティションオプション

    この記事は初心者を対象としており、パーティション化されたテーブルは初心者のチュートリアルの領域から少し外れています。

    そうは言っても、ALTER TABLEに関するいくつかのパーティショニングオプションについて簡単に説明します。 ステートメント。

    DBMSがパーティションテーブルをサポートしている場合は、おそらくALTER TABLEでパーティションオプションも提供します。 ステートメント。

    たとえば、MySQLでは次のことができます。

    ALTER TABLE Products
    PARTITION BY HASH(ProductId)
    PARTITIONS 8;

    これにより、テーブルがHASHによって8つのパーティションに分割されます。 、ProductIdを使用 パーティションキーとしての列。

    PARTITION BY HASH 式の残りの部分(この場合はProductId)を使用します 列)をパーティションの数(つまり、モジュラス)で割った値。

    範囲パーティションを使用することもできます。既存のテーブルに範囲パーティションを追加する方法は次のとおりです。

    ALTER TABLE Products 
    ADD PARTITION (PARTITION Partition9 VALUES LESS THAN (2020));

    この例は、Products テーブルにはすでに8つの範囲パーティションがあり、Partition9という別のパーティションを追加しています 。

    次のようにパーティションを削除できます:

    ALTER TABLE Products 
    DROP PARTITION Partition8, Partition9;

    これらの例はMySQL用であることに注意してください。

    また、SQLServerのパーティションテーブルに関する記事もいくつか書いています。 ALTER TABLEに関して ステートメント、パーティションを切り替える方法とパーティションを切り替える方法は次のとおりです(どちらもALTER TABLEで実行されます) 。

    SQL Serverでは、一部のパーティションオプションを他のステートメントで実行する必要があります。たとえば、パーティションのマージは、ALTER PARTITION FUNCTIONを使用して行われます。 ステートメント、およびパーティションの分割は、ALTER PARTITION SCHEMEを使用して行われます。 ステートメント。

    SQL Serverのパーティションテーブルについて詳しく知りたい場合は、SQLServerでパーティションテーブルを作成する方法をご覧ください。

    ALTER TABLE SQLiteで

    また、SQLiteはALTER TABLEのサポートが非常に限られていることにも言及する必要があります 声明。 SQLiteでは、ALTER TABLE ステートメントを使用すると、テーブルの名前を変更したり、テーブル内の列の名前を変更したり、既存のテーブルに新しい列を追加したりできます。

    その他の変更を行う場合は、テーブルを削除してやり直す必要があります。これは、外部キーの追加にも当てはまります。


    1. レコードが変更されたときに自動的に更新されるSQLServerの日時列が必要です

    2. Oracleのテーブル/列/インデックス名が30文字に制限されているのはなぜですか?

    3. date_trunc()がPostgreSQLでどのように機能するか

    4. MySQLmy.iniの場所