sql >> Databasteknik >  >> RDS >> Sqlserver

Förstå SQL Server ALTER TABLE ADD COLUMN Statement

Den här artikeln beskriver SQL Server ALTER TABLE ADD COLUMN-satsen. Syftet med detta uttalande är att lägga till en ny kolumn i en befintlig tabell. Dessutom kommer artikeln att förtydliga följande användningsfall:

  1. Lägg till flera kolumner.
  2. Lägg till en ny primärnyckelkolumn.
  3. Lägg till en ny kolumn för främmande nyckel.
  4. Lägg till nya kolumner som har beräknade kolumner.
  5. Lägg till en ny kolumn som har CHECK och UNIKA begränsningar.

Syntaxspecificiteten för SQL ALTER TABLE ADD COLUMN-satsen

När vi ska utforska uttalandet grundligt, låt oss börja med att förstå syntaxen:

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

Observera följande aspekter:

  1. Du måste ange namnet på tabellen där du vill lägga till en kolumn efter ÄNDRA TABELL .
  2. namnet på kolumnen eller kolumnerna måste vara efter ADD . För flera kolumner, separera deras namn med kommatecken.
  3. Ange kolumndatatyperna efter kolumnnamnet .
  4. Om du lägger till någon begränsning, en primärnyckel eller en främmande nyckel , ange det efter datatypen .

För demonstrationsändamål har jag skapat en databas med namnet CodingSight . Där har jag skapat tre tabeller som heter tbldepartment , anställd, och tblCity, och infogade dummydata i dessa tabeller.

Följande skript skapar en databas och tabeller:

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

Skriptet nedan infogar dummydata i tabellen:

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

Låt oss nu gå vidare till användningsfallen.

Lägg till flera kolumner i en tabell

I vårt exempel vill vi lägga till Staten och Pincode kolumner till tbleCity tabell. Datatypen förStaten kolumnen är VARCHAR och längden på kolumnen är 150. Datatypen för Pincode kolumnen är INTEGER. För att lägga till kolumner, kör följande fråga:

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

Kör nu frågan för att se kolumnlistan för tblCity tabell:

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'

Frågeutgången:

Som du kan se är Staten och Pincode kolumner har lagts till.

Lägg till primära nyckelkolumner i en tabell

Låt oss lägga till kolumnen Primärnyckel i tblCity tabell. Enligt affärskraven måste vi lägga till en kolumn med en kombination av ett tecken och ett fyrsiffrigt nummer för att identifiera staden.

Vi lägger till en ny kolumn med namnet Stadskod till tblCity tabell. Datatypen för Stadskod är varchar, och längden är fem. Kör följande fråga för att lägga till en kolumn:

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

Utdata:

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.

Frågan returnerar ett fel eftersom primärnyckeln måste vara unik och inte null. För att lägga till en kolumn i den här tabellen måste vi följa stegen nedan:

Steg:1

Skapa en ny tom tabell med namnet tblCity_Temp med definitionen av den befintliga tblCity tabell. Den nya tabellen har en primärnyckelkolumn.

Skapandet skriptet är som följer:

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

Steg:2

Infoga data i tblCity_Temp tabellen från tblCity tabell:

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

Steg:3

Byt namn på tabellerna enligt nedan:

  1. Gammalt namn: tblCityNytt namn: tblCity_Old.
  2. Gammalt namn: tblCity_TempNytt namn: tblCity .

Var uppmärksam på frågan om namn på tabeller:

USE codingsight 
go 

EXEC Sp_rename 
  'tblCity', 
  'tblCity_Old' 
go 

EXEC Sp_rename 
  'tblCity_Temp', 
  'tblCity' 
go

Kör nu följande fråga för att se den nyligen tillagda primärnyckeln:

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  

Utgången:

Använd frågan för datavisning:

SELECT * FROM tblCity c

Utgången:

Lägg till främmande nyckelkolumner i en tabell

Anta att vi vill lägga till en kolumn med namnet deptID till tblEmployee tabell. Datatypen för kolumnen är INTEGER. Den refererar till avdelnings-ID kolumnen i tbldepartment bord.

Frågan är följande:

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

Kör nästa fråga för att se den nya kolumnen för främmande nyckel:

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   

Utgången:

Notera ER-diagrammet:

På så sätt har vi skapat en främmande nyckel som heter FK_DepartmentID .

Lägg till en kolumn med CHECK och DEFAULT Constraint

Låt oss nu lägga till en kolumn med namnet minimum_löner till anställda tabell. Datatypen för kolumnen är pengar .

minimilönen kolumns värde måste vara större eller lika med 5,60 $. Därför har vi skapat checken villkor för att verifiera det infogade värdet – det måste vara högre än 5,60 $. Dessutom är standardvärdet av kolumnen är 5,60 $.

För att lägga till kolumnen, kör följande fråga:

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;

Följande fel uppstår:

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'.

Värdet som anges för minimum_löner kolumnen är mindre än 5,6. Det är därför frågan har returnerat ett fel.

Ändra värdet på minimumlöner värde och kör frågan igen:

UPDATE tblemployee SET minimum_wages=5.8 WHERE employeeID =5;

Utgången:

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

När vi har uppdaterat posten, kör nedanstående fråga för att se data:

Select * from tblemployee where employeeID=5

Utgången:

För att verifiera att standardbegränsningen fungerar, kör följande INSERT-sats:

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

När posten har infogats, låt oss se data:

Frågan:

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

Utgången:

Jag har inte angett värdet på minimumlöner kolumn. Därför infogas standardvärdet i tabellen.

Sammanfattning

Artikeln klargjorde essensen av ALTER TABLE ADD COLUMN-satsen, dess syntax och olika användningsfall av implementeringar.

Läs också

Grunderna i SQL Server ALTER TABLE Statement
Förstå SQL DELETE Kolumn från tabell
Förstå DROP TABLE OM FINNS SQL-sats


  1. Välja en processor för SQL Server 2014 – Del 2

  2. Hur man förbereder satser och bindningsparametrar i Postgresql för C++

  3. JSON_MERGE_PATCH() vs JSON_MERGE_PRESERVE() i MySQL:Vad är skillnaden?

  4. Bästa metoder för skalning av databaser:del två