sql >> Databáze >  >> RDS >> Sqlserver

Vysvětlení SQL Server Příkaz ALTER TABLE ADD COLUMN

Tento článek popisuje příkaz SQL Server ALTER TABLE ADD COLUMN. Účelem tohoto příkazu je přidat nový sloupec do existující tabulky. Článek také objasní následující případy použití:

  1. Přidejte více sloupců.
  2. Přidejte nový sloupec primárního klíče.
  3. Přidejte nový sloupec cizího klíče.
  4. Přidejte nové sloupce, které mají vypočítané sloupce.
  5. Přidejte nový sloupec, který má omezení CHECK a UNIQUE.

Specificita syntaxe příkazu SQL ALTER TABLE ADD COLUMN

Když se chystáme důkladně prozkoumat příkaz, začněme pochopením syntaxe:

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

Všimněte si následujících aspektů:

  1. Musíte zadat název tabulky kam chcete přidat sloupec za ALTER TABLE .
  2. Název sloupce nebo sloupců musí být po PŘIDAT . U více sloupců oddělte jejich názvy čárkami.
  3. Za názvem sloupce zadejte datové typy sloupců .
  4. Pokud přidáváte jakékoli omezení, primární klíč nebo cizí klíč , zadejte jej za typ dat .

Pro demonstrační účely jsem vytvořil databázi s názvem CodingSight . Tam jsem vytvořil tři tabulky s názvem tbldepartment , tblemployee, a tblCity, a vložil do těchto tabulek fiktivní data.

Následující skript vytvoří databázi a tabulky:

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

Níže uvedený skript vloží fiktivní data do tabulky:

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

Nyní pojďme k případům použití.

Přidání více sloupců do tabulky

V našem příkladu chceme přidat Stát a Pincode sloupců do tbleCity stůl. Datový typState sloupec je VARCHAR a délka sloupce je 150. Datový typ Pincode sloupec je INTEGER. Chcete-li přidat sloupce, spusťte následující dotaz:

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

Nyní spusťte dotaz a zobrazte seznam sloupců tblCity tabulka:

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'

Výstup dotazu:

Jak vidíte, stát a Pincode byly přidány sloupce.

Přidat sloupce primárního klíče do tabulky

Přidejte sloupec Primární klíč do tblCity stůl. Podle obchodních požadavků musíme pro identifikaci města přidat sloupec s kombinací znaku a čtyřmístného čísla.

Přidáváme nový sloupec s názvem City_Code do tblCity stůl. Datový typ City_Code je varchar a délka je pět. Spuštěním následujícího dotazu přidejte sloupec:

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

Výstup:

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.

Dotaz vrátí chybu, protože primární klíč musí být jedinečný a nesmí mít hodnotu null. Chcete-li do této tabulky přidat sloupec, musíme postupovat podle následujících kroků:

Krok:1

Vytvořte novou prázdnou tabulku s názvem tblCity_Temp pomocí definice stávajícího tblCity stůl. Nová tabulka má sloupec primárního klíče.

Skript vytvoření je následující:

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

Krok:2

Vložte data do tblCity_Temp tabulky z tblCity tabulka:

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

Krok:3

Přejmenujte tabulky, jak je uvedeno níže:

  1. Starý název: tblCityNové jméno: tblCity_Old.
  2. Starý název: tblCity_TempNové jméno: tblCity .

Věnujte pozornost dotazu na přejmenování tabulky:

USE codingsight 
go 

EXEC Sp_rename 
  'tblCity', 
  'tblCity_Old' 
go 

EXEC Sp_rename 
  'tblCity_Temp', 
  'tblCity' 
go

Nyní spusťte následující dotaz a zobrazte nově přidaný primární klíč:

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  

Výstup:

Pro zobrazení dat použijte dotaz:

SELECT * FROM tblCity c

Výstup:

Přidat do tabulky sloupce cizího klíče

Předpokládejme, že chceme přidat sloupec s názvem deptID na tblZaměstnance stůl. Datový typ sloupce je INTEGER. Odkazuje na ID oddělení sloupec tbloddělení tabulka.

Dotaz je následující:

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

Spuštěním dalšího dotazu zobrazíte nový sloupec cizího klíče:

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   

Výstup:

Všimněte si diagramu ER:

Tímto způsobem jsme vytvořili cizí klíč s názvem FK_DepartmentID .

Přidat sloupec s omezením CHECK a DEFAULT

Nyní přidejte sloupec s názvem minimum_mzdy na tblemployee stůl. Datový typ sloupce je peníze .

minimální_mzdu hodnota sloupce musí být větší nebo rovna 5,60 $. Proto jsme vytvořili kontrolu podmínka pro ověření vložené hodnoty – musí být vyšší než 5,60 $. Navíc výchozí hodnota sloupce je 5,60 $.

Chcete-li přidat sloupec, spusťte následující dotaz:

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;

Dojde k následující chybě:

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

Hodnota určená pro minimální_mzdy sloupec je menší než 5,6. To je důvod, proč dotaz vrátil chybu.

Změňte hodnotu minimálních_mzd hodnotu a spusťte dotaz znovu:

UPDATE tblemployee SET minimum_wages=5.8 WHERE employeeID =5;

Výstup:

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

Jakmile záznam aktualizujeme, spusťte níže uvedený dotaz a zobrazte data:

Select * from tblemployee where employeeID=5

Výstup:

Chcete-li ověřit, že výchozí omezení funguje, spusťte následující příkaz INSERT:

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

Jakmile je záznam vložen, podívejme se na data:

Dotaz:

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

Výstup:

Hodnotu minimálních_mzd jsem neuvedl sloupec. Do tabulky se tedy vloží výchozí hodnota.

Shrnutí

Článek objasnil podstatu příkazu ALTER TABLE ADD COLUMN, jeho syntaxi a různé případy použití implementací.

Přečtěte si také

Základy SQL Serveru Příkaz ALTER TABLE
Pochopení SQL DELETE sloupec z tabulky
Vysvětlení příkazu SQL DROP TABLE IF EXISTS


  1. Jak mohu vytisknout výsledky dotazů MySQL ve formátu CSV?

  2. Jak získat aktuální hodnotu věštecké sekvence bez jejího zvýšení?

  3. Jak mohu získat seznam názvů prvků z hodnoty XML v SQL Server

  4. 4 způsoby, jak získat historii úloh SQL Server