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

SQLServerのALTERTABLEADDCOLUMNステートメントについて

    この記事では、SQLServerのALTERTABLEADDCOLUMNステートメントについて説明します。このステートメントの目的は、既存のテーブルに新しい列を追加することです。また、この記事では、次のユースケースを明確にします。

    1. 複数の列を追加します。
    2. 新しい主キー列を追加します。
    3. 新しい外部キー列を追加します。
    4. 計算列を持つ新しい列を追加します。
    5. CHECK制約とUNIQUE制約を持つ新しい列を追加します。

    SQL ALTER TABLEADDCOLUMNステートメントの構文の特異性

    ステートメントを徹底的に調査するので、構文を理解することから始めましょう:

    Alter table [table_name] add column [column_name] [data_type][constraint]

    次の点に注意してください。

    1. テーブルの名前を指定する必要があります 後に列を追加する場所 代替テーブル
    2. 1つまたは複数の列の名前 追加後である必要があります 。複数の列の場合は、名前をコンマで区切ります。
    3. 列名の後に列のデータ型を指定します
    4. 制約、主キー、または外部キーを追加する場合データ型の後に指定します 。

    デモンストレーションの目的で、 CodingSightという名前のデータベースを作成しました。 。そこで、 tbldepartmentという名前の3つのテーブルを作成しました tblemployee、 およびtblCity ダミーデータをそれらのテーブルに挿入しました。

    次のスクリプトは、データベースとテーブルを作成します。

    USE codingsight
    GO
    CREATE TABLE tbldepartment(departmentID INT IDENTITY(1,1), departmentname VARCHAR(50), 
    CONSTRAINT PK_departmentID  PRIMARY KEY  (departmentID))
    GO
    CREATE TABLE tblemployee(employeeID INT IDENTITY(1,1), name VARCHAR(50), Address VARCHAR(max), PhoneNumber VARCHAR(10)
    CONSTRAINT PK_employeeID  PRIMARY KEY  (employeeID))
    GO
    CREATE TABLE tblCity( Name VARCHAR(50), Country VARCHAR(100))
    GO
    

    次のスクリプトは、ダミーデータをテーブルに挿入します。

    INSERT INTO tbldepartment (departmentname) VALUES ('IT'),('Devlopment Team'),('Human Resource'),('Qualiy Assurance')
    GO
    INSERT INTO tblemployee (name, address, PhoneNumber) VALUES 
    ('Nisarg Upadhyay','AB14, Akshardham Flats, Mehsana', 1234567890),
    ('Nirali Upadhyay','AB05, Suyojan Flats, Surat', 1234567890),
    ('Dixit Upadhyay','B14, Suyash Flats, Vadodara', 1234567890),
    ('Bharti Upadhyay','C14, Suramya Flats, Ahmedabad', 1234567890),
    ('Sawan panchal','P18, Kirti Flats, Ahmedabad', 1234567890),
    ('Raghav Dave','A14, Suramya Flats, Ahmedabad', 1234567890)
    GO
    INSERT INTO tblCity (name, country)VALUES 
    ('Ahmedabad','India'),
    ('Surat','India'),
    ('Vadodara','India'),
    ('Gandhinagar','India')
    Go
    

    それでは、ユースケースに進みましょう。

    テーブルに複数の列を追加する

    この例では、状態を追加します。 およびピンコード tbleCityへの列 テーブル。 状態のデータ型 列はVARCHARで、列の長さは150です。ピンコードのデータ型 列はINTEGERです。列を追加するには、次のクエリを実行します。

    ALTER TABLE tblCity ADD State VARCHAR(150), Pincode INT

    次に、クエリを実行して、 tblCityの列リストを表示します。 テーブル:

    USE CodingSight
    go
    SELECT c.TABLE_SCHEMA,c.TABLE_NAME,c.COLUMN_NAME,c.DATA_TYPE,c.CHARACTER_MAXIMUM_LENGTH 
    FROM INFORMATION_SCHEMA.COLUMNS c WHERE C.TABLE_NAME='tblCity'
    

    クエリ出力:

    ご覧のとおり、状態 およびピンコード 列が追加されました。

    テーブルに主キー列を追加する

    tblCityに主キー列を追加しましょう テーブル。ビジネス要件に応じて、都市を識別するために文字と4桁の数字を組み合わせた列を追加する必要があります。

    City_Codeという名前の新しい列を追加します tblCity テーブル。 City_Codeのデータ型 はvarcharで、長さは5です。次のクエリを実行して列を追加します:

    ALTER TABLE tblCity ADD City_Code VARCHAR(5) PRIMARY KEY  CLUSTERED

    出力:

    Msg 4901, Level 16, State 1, Line 29
    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. 
    Alternatively, if none of the previous conditions are satisfied the table must be empty to allow the addition of this column. 
    Column 'City_Code' cannot be added to non-empty table 'tblCity' because it does not satisfy these conditions.
    

    主キーは一意であり、nullであってはならないため、クエリはエラーを返します。このテーブルに列を追加するには、次の手順に従う必要があります。

    ステップ:1

    tblCity_Tempという名前の新しい空のテーブルを作成します 既存のtblCityの定義を使用する テーブル。新しいテーブルには主キー列があります。

    作成スクリプトは次のとおりです。

    CREATE TABLE tblCity_Temp( City_code VARCHAR(5) CONSTRAINT PK_City_Code PRIMARY KEY CLUSTERED,
    Name VARCHAR(50), Country VARCHAR(100))
    GO
    

    ステップ:2

    データをtblCity_Tempに挿入します tblCityのテーブル テーブル:

    INSERT INTO tblCity_Temp (City_code,name, country)VALUES 
    ('C0001','Ahmedabad','India'),
    ('C0002','Surat','India'),
    ('C0003','Vadodara','India'),
    ('C0004','Gandhinagar','India')
    GO
    

    ステップ:3

    以下に示すように、テーブルの名前を変更します。

    1. 旧名: tblCity 新しい名前: tblCity_Old。
    2. 旧名: tblCity_Temp 新しい名前: tblCity

    テーブルの名前変更クエリに注意してください:

    USE codingsight 
    go 
    
    EXEC Sp_rename 
      'tblCity', 
      'tblCity_Old' 
    go 
    
    EXEC Sp_rename 
      'tblCity_Temp', 
      'tblCity' 
    go
    

    次に、次のクエリを実行して、新しく追加された主キーを表示します。

    USE codingsight 
    
    go 
    
    SELECT Schema_name(tbl.schema_id)    AS [schema_name], 
           primary_key.[name]            AS pk_name, 
           index_columns.index_column_id AS column_id, 
           TABLE_coumns.[name]           AS column_name, 
           tbl.[name]                    AS table_name 
    FROM   sys.tables tbl 
           INNER JOIN sys.indexes primary_key 
                   ON tbl.object_id = primary_key.object_id 
                      AND primary_key.is_primary_key = 1 
           INNER JOIN sys.index_columns index_columns 
                   ON index_columns.object_id = primary_key.object_id 
                      AND index_columns.index_id = primary_key.index_id 
           INNER JOIN sys.columns TABLE_coumns 
                   ON primary_key.object_id = TABLE_coumns.object_id 
                      AND TABLE_coumns.column_id = index_columns.column_id 
                      AND tbl.NAME = 'tblCity' 
    ORDER  BY Schema_name(tbl.schema_id), 
              primary_key.[name], 
              index_columns.index_column_id  
    

    出力:

    データ表示のクエリを使用します:

    SELECT * FROM tblCity c

    出力:

    テーブルへの外部キー列の追加

    deptIDという名前の列を追加するとします。 tblEmployee テーブル。列のデータ型はINTEGERです。 departmentIDを参照します tbldepartmentの列 テーブル。

    クエリは次のとおりです。

    ALTER TABLE tblEmployee ADD deptID INTEGER,CONSTRAINT  FK_DepartmentID FOREIGN KEY(deptID) REFERENCES tbldepartment(departmentID)

    次のクエリを実行して、新しい外部キー列を表示します。

    USE codingsight 
    go 
    
    SELECT Schema_name(tbl.schema_id) + '.' + tbl.NAME       AS foreign_table, 
           Schema_name(primarykey_tab.schema_id) + '.' 
           + primarykey_tab.NAME                             AS primary_table, 
           Substring(column_names, 1, Len(column_names) - 1) AS [fk_columns], 
           foreignkeys.NAME                                  AS fk_constraint_name 
    FROM   sys.foreign_keys foreignkeys 
           INNER JOIN sys.tables tbl 
                   ON tbl.object_id = foreignkeys.parent_object_id 
           INNER JOIN sys.tables primarykey_tab 
                   ON primarykey_tab.object_id = foreignkeys.referenced_object_id 
           CROSS apply (SELECT col.[name] + ', ' 
                        FROM   sys.foreign_key_columns fk_columns 
                               INNER JOIN sys.columns col 
                                       ON fk_columns.parent_object_id = 
                                          col.object_id 
                                          AND fk_columns.parent_column_id = 
                                              col.column_id 
                        WHERE  fk_columns.parent_object_id = tbl.object_id 
                               AND fk_columns.constraint_object_id = 
                                   foreignkeys.object_id 
                        ORDER  BY col.column_id 
                        FOR xml path ('')) D (column_names) 
    ORDER  BY Schema_name(tbl.schema_id) + '.' + tbl.NAME, 
              Schema_name(primarykey_tab.schema_id) + '.' 
              + primarykey_tab.NAME   
    

    出力:

    ER図に注意してください:

    このようにして、 FK_DepartmentIDという名前の外部キーを作成しました。

    CHECKおよびDEFAULT制約のある列を追加する

    次に、 minimum_wagesという名前の列を追加しましょう。 tblemployee テーブル。列のデータ型はmoneyです。 。

    minimum_wage 列の値は5.60$以上である必要があります。そのため、チェックを作成しました 挿入された値を確認するための条件–5.60$より高くなければなりません。さらに、デフォルト値 列のは5.60$です。

    列を追加するには、次のクエリを実行します。

    USE codingsight 
    go 
    ALTER TABLE tblemployee 
    ADD minimum_wages MONEY CONSTRAINT chk_minimum_wages CHECK (minimum_wages>=5.6)
    CONSTRAINT df_minimum_wages DEFAULT 5.6;  
    Next, we run the UPDATE query to change the values:
    UPDATE tblemployee SET minimum_wages=5.5 WHERE employeeID =5;
    

    次のエラーが発生します:

    Msg 547, Level 16, State 0, Line 78
    The UPDATE statement conflicted with the CHECK constraint "CHK_minimum_wages". 
    The conflict occurred in database "CodingSight", table "dbo.tblemployee", column 'minimum_wages'.
    

    minimum_wagesに指定された値 列が5.6未満です。クエリがエラーを返したのはそのためです。

    minimum_wagesの値を変更します 値を付けてクエリを再実行します:

    UPDATE tblemployee SET minimum_wages=5.8 WHERE employeeID =5;

    出力:

    (1 row affected)
    Completion time: 2020-12-14T17:22:40.8995851+05:30
    

    レコードを更新したら、以下のクエリを実行してデータを表示します。

    Select * from tblemployee where employeeID=5

    出力:

    デフォルトの制約が機能していることを確認するには、次のINSERTステートメントを実行します。

    USE codingsight 
    GO
    INSERT INTO tblemployee (name, Address, PhoneNumber,deptID) VALUES ('Dilip Patel','Satyamev Famosa, Gandhinagar','9537021112',1)
    

    レコードが挿入されたら、データを表示しましょう:

    クエリ:

    USE CodingSight
    go
    SELECT * FROM tblemployee t WHERE t.employeeID=25
    

    出力:

    minimum_wagesの値を指定していません 桁。したがって、デフォルト値がテーブルに挿入されます。

    概要

    この記事では、ALTER TABLE ADD COLUMNステートメントの本質、その構文、および実装のさまざまなユースケースを明確にしました。

    また読む

    SQLServerの基本ALTERTABLEステートメント
    テーブルからのSQLDELETE列について
    DROP TABLE IFEXISTSSQLステートメントについて


    1. AWS上のWindowsでのShareplex入門、パート1

    2. OracleのDECODEがNVLとは異なる値を与えるのはなぜですか?

    3. 新しいDBシステムを学ぶことの利点

    4. MariaDBを使用したLDAP認証とグループマッピングの構成