この記事では、SQLServerのALTERTABLEADDCOLUMNステートメントについて説明します。このステートメントの目的は、既存のテーブルに新しい列を追加することです。また、この記事では、次のユースケースを明確にします。
- 複数の列を追加します。
- 新しい主キー列を追加します。
- 新しい外部キー列を追加します。
- 計算列を持つ新しい列を追加します。
- CHECK制約とUNIQUE制約を持つ新しい列を追加します。
SQL ALTER TABLEADDCOLUMNステートメントの構文の特異性
ステートメントを徹底的に調査するので、構文を理解することから始めましょう:
Alter table [table_name] add column [column_name] [data_type][constraint]
次の点に注意してください。
- テーブルの名前を指定する必要があります 後に列を追加する場所 代替テーブル 。
- 1つまたは複数の列の名前 追加後である必要があります 。複数の列の場合は、名前をコンマで区切ります。
- 列名の後に列のデータ型を指定します 。
- 制約、主キー、または外部キーを追加する場合 、データ型の後に指定します 。
デモンストレーションの目的で、 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
以下に示すように、テーブルの名前を変更します。
- 旧名: tblCity – 新しい名前: tblCity_Old。
- 旧名: 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ステートメントについて