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

SQLite ALTER TABLE

    概要 :このチュートリアルでは、SQLite ALTER TABLEの使用方法を学習します 既存のテーブルの構造を変更するステートメント。

    SQL標準や他のデータベースシステムとは異なり、SQLiteは ALTER TABLEの非常に限定された機能をサポートします ステートメント。

    SQLite ALTER TABLEを使用する ステートメントでは、2つのアクションを実行できます:

    1. テーブルの名前を変更します。
    2. テーブルに新しい列を追加します。
    3. 列の名前を変更します(バージョン3.20.0でサポートされるように追加されました)

    SQLiteALTERTABLEを使用してテーブルの名前を変更する

    テーブルの名前を変更するには、次の ALTER TABLE RENAME TOを使用します ステートメント:

    ALTER TABLE existing_table
    RENAME TO new_table;Code language: SQL (Structured Query Language) (sql)

    テーブルの名前を変更する前に知っておくべき重要なポイントは次のとおりです。

    • ALTER TABLE データベース内のテーブルの名前を変更するだけです。これを使用して、接続されているデータベース間でテーブルを移動することはできません。
    • テーブルに関連付けられているインデックスやトリガーなどのデータベースオブジェクトは、新しいテーブルに関連付けられます。
    • トリガー内のビューまたはステートメントによってテーブルが参照されている場合は、ビューとトリガーの定義を手動で変更する必要があります。

    テーブルの名前を変更する例を見てみましょう。

    まず、 devicesという名前のテーブルを作成します name、の3つの列があります モデル serial ; devicesに新しい行を挿入します テーブル。

    CREATE TABLE devices (
       name TEXT NOT NULL,
       model TEXT NOT NULL,
       Serial INTEGER NOT NULL UNIQUE
    );
    
    INSERT INTO devices (name, model, serial)
    VALUES('HP ZBook 17 G3 Mobile Workstation','ZBook','SN-2015');Code language: SQL (Structured Query Language) (sql)

    試してみてください

    次に、 ALTER TABLE RENAME TOを使用します デバイスを変更するステートメント 機器へのテーブル 次のような表:

    ALTER TABLE devices
    RENAME TO equipment;Code language: SQL (Structured Query Language) (sql)

    試してみてください

    第三に、機器からデータをクエリします RENAMEを確認するためのテーブル 操作。

    SELECT
    	name,
    	model,
    	serial
    FROM
    	equipment;Code language: SQL (Structured Query Language) (sql)

    試してみてください

    SQLiteALTERTABLEを使用して新しい列をテーブルに追加する

    SQLiteのALTERTABLEを使用できます 既存のテーブルに新しい列を追加するステートメント。このシナリオでは、SQLiteは既存の列リストの最後に新しい列を追加します。

    次に、 ALTER TABLE ADD COLUMNの構文を示します。 ステートメント:

    ALTER TABLE table_name
    ADD COLUMN column_definition;Code language: SQL (Structured Query Language) (sql)

    新しい列にはいくつかの制限があります:

    • 新しい列にUNIQUEを含めることはできません またはPRIMARYKEY 制約。
    • 新しい列にNOTNULLがある場合 制約がある場合は、 NULL以外の列のデフォルト値を指定する必要があります 値。
    • 新しい列のデフォルトをCURRENT_TIMESTAMPにすることはできません 、 CURRENT_DATE 、および CURRENT_TIME 、または式。
    • 新しい列が外部キーであり、外部キー制約チェックが有効になっている場合、新しい列はデフォルト値 NULLを受け入れる必要があります 。

    たとえば、 locationという名前の新しい列を追加できます 機器に テーブル:

    ALTER TABLE equipment 
    ADD COLUMN location text;Code language: SQL (Structured Query Language) (sql)

    試してみてください

    SQLiteALTERTABLEを使用して列の名前を変更する

    SQLiteは、 ALTER TABLE RENAME COLUMNを使用して列の名前を変更するためのサポートを追加しました バージョン3.20.0のステートメント

    次に、 ALTER TABLE RENAME COLUMNの構文を示します。 ステートメント:

    ALTER TABLE table_name
    RENAME COLUMN current_name TO new_name;

    列の名前を変更する方法の詳細については、列の名前変更のチュートリアルをご覧ください。

    他のアクションにSQLiteALTERTABLEを使用する

    列をドロップするなど、他のアクションを実行する場合は、次の手順を使用します。

    次のスクリプトは、上記の手順を示しています。

    -- disable foreign key constraint check
    PRAGMA foreign_keys=off;
    
    -- start a transaction
    BEGIN TRANSACTION;
    
    -- Here you can drop column
    CREATE TABLE IF NOT EXISTS new_table( 
       column_definition,
       ...
    );
    -- copy data from the table to the new_table
    INSERT INTO new_table(column_list)
    SELECT column_list
    FROM table;
    
    -- drop the table
    DROP TABLE table;
    
    -- rename the new_table to the table
    ALTER TABLE new_table RENAME TO table; 
    
    -- commit the transaction
    COMMIT;
    
    -- enable foreign key constraint check
    PRAGMA foreign_keys=on;Code language: SQL (Structured Query Language) (sql)

    SQLite ALTER TABLE DROP COLUMN

    SQLiteはALTERTABLE DROP COLUMNをサポートしていません 声明。列を削除するには、上記の手順を使用する必要があります。

    次のスクリプトは、2つのテーブル usersを作成します およびfavorites 、およびこれらのテーブルにデータを挿入します:

    CREATE TABLE users(
    	UserId INTEGER PRIMARY KEY,
    	FirstName TEXT NOT NULL,
    	LastName TEXT NOT NULL,
    	Email TEXT NOT NULL,
    	Phone TEXT NOT NULL
    );
    
    CREATE TABLE favorites(
    	UserId INTEGER,
    	PlaylistId INTEGER,
    	FOREIGN KEY(UserId) REFERENCES users(UserId),
    	FOREIGN KEY(PlaylistId) REFERENCES playlists(PlaylistId)
    );
    
    INSERT INTO users(FirstName, LastName, Email, Phone)
    VALUES('John','Doe','[email protected]','408-234-3456');
    
    INSERT INTO favorites(UserId, PlaylistId)
    VALUES(1,1);Code language: SQL (Structured Query Language) (sql)

    次のステートメントは、 usersからデータを返します テーブル:

    SELECT * FROM users;Code language: SQL (Structured Query Language) (sql)

    そして、次のステートメントはお気に入りからのデータを返します テーブル:

    SELECT * FROM favorites;Code language: SQL (Structured Query Language) (sql)

    phone列を削除するとします。 ユーザーの テーブル。

    まず、外部キー制約チェックを無効にします。

    PRAGMA foreign_keys=off;

    次に、新しいトランザクションを開始します:

    BEGIN TRANSACTION;Code language: SQL (Structured Query Language) (sql)

    3番目に、ユーザーのデータを保持するための新しいテーブルを作成します phoneを除くテーブル 列:

    CREATE TABLE IF NOT EXISTS persons (
    	UserId INTEGER PRIMARY KEY,
    	FirstName TEXT NOT NULL,
    	LastName TEXT NOT NULL,
    	Email TEXT NOT NULL
    );Code language: SQL (Structured Query Language) (sql)

    第4に、 usersからデータをコピーします へ テーブル:

    INSERT INTO persons(UserId, FirstName, LastName, Email)
    SELECT UserId, FirstName, LastName, Email 
    FROM users;
    Code language: SQL (Structured Query Language) (sql)

    5番目に、 usersを削除します テーブル:

    DROP TABLE users;Code language: SQL (Structured Query Language) (sql)

    6番目に、 peopleの名前を変更します ユーザーへのテーブル テーブル:

    ALTER TABLE persons RENAME TO users;Code language: SQL (Structured Query Language) (sql)

    第7に、トランザクションをコミットします:

    COMMIT;Code language: SQL (Structured Query Language) (sql)

    8番目に、外部キー制約チェックを有効にします。

    PRAGMA foreign_keys=on;Code language: SQL (Structured Query Language) (sql)

    これがusersです phoneを削除した後のテーブル 列:

    SELECT * FROM users;Code language: SQL (Structured Query Language) (sql)

    概要

    • ALTER TABLEを使用します 既存のテーブルの構造を変更するステートメント。
    • ALTER TABLE table_name RENAME TO new_nameを使用します テーブルの名前を変更するステートメント。
    • ALTER TABLE table_name ADD COLUMN column_definitionを使用します テーブルに列を追加するステートメント。
    • ALTER TABLE table_name RENAME COLUMN current_name TO new_nameを使用します 列の名前を変更します。

    1. 2つのテーブルを3番目のテーブルのFKと結合する必要があります

    2. DockerでのMariaDBMaxScaleロードバランシング:デプロイメント:パート1

    3. エラーは何ですかすべての派生テーブルはMySQLで独自のエイリアスを持っている必要がありますか?

    4. Mysqlselectdistinct