sql >> Database teknologi >  >> RDS >> Sqlserver

Forstå SQL Server ÆNDRINGSTABEL TILFØJ KOLONNE-erklæring

Denne artikel beskriver SQL Server ALTER TABLE ADD COLUMN-sætningen. Formålet med denne erklæring er at tilføje en ny kolonne til en eksisterende tabel. Artiklen vil også afklare følgende anvendelsestilfælde:

  1. Tilføj flere kolonner.
  2. Tilføj en ny primær nøglekolonne.
  3. Tilføj en ny fremmednøglekolonne.
  4. Tilføj nye kolonner, der har beregnede kolonner.
  5. Tilføj en ny kolonne, der har CHECK og UNIQUE begrænsninger.

Syntaksspecificiteten af ​​SQL ALTER TABLE ADD COLUMN-sætningen

Lad os begynde med at forstå syntaksen, da vi skal udforske sætningen grundigt:

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

Bemærk følgende aspekter:

  1. Du skal angive navnet på tabellen hvor du vil tilføje en kolonne efter ÆNDRE TABEL .
  2. navnet på kolonnen eller kolonnerne skal være efter ADD . For flere kolonner skal du adskille deres navne med kommaer.
  3. Angiv kolonnedatatyperne efter kolonnenavnet .
  4. Hvis du tilføjer en hvilken som helst begrænsning, en primærnøgle eller en fremmednøgle , angiv den efter datatypen .

Til demonstrationsformål har jeg oprettet en database ved navn CodingSight . Der har jeg lavet tre tabeller med navnet tbldepartment , medarbejder og tblCity, og indsatte dummy-data i disse tabeller.

Følgende script opretter en database og 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

Nedenstående script indsætter dummy-dataene 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

Lad os nu gå videre til brugstilfældene.

Tilføj flere kolonner til en tabel

I vores eksempel ønsker vi at tilføje Staten og Pinkode kolonner til tbleCity bord. Datatypen forStaten kolonnen er VARCHAR, og kolonnens længde er 150. Datatypen for Pincode kolonne er HELTAL. For at tilføje kolonner skal du køre følgende forespørgsel:

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

Kør nu forespørgslen for at se kolonnelisten for tblCity tabel:

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'

Forespørgselsoutput:

Som du kan se, er Staten og Pinkode kolonner er blevet tilføjet.

Tilføj primære nøglekolonner til en tabel

Lad os tilføje Primary Key-kolonnen til tblCity bord. I henhold til forretningskravene skal vi tilføje en kolonne med en kombination af et tegn og et firecifret tal for at identificere byen.

Vi tilføjer en ny kolonne med navnet City_Code til tblCity bord. Datatypen for City_Code er varchar, og længden er fem. Kør følgende forespørgsel for at tilføje en kolonne:

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

Udgangen:

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.

Forespørgslen returnerer en fejl, fordi den primære nøgle skal være unik og ikke null. For at tilføje en kolonne til denne tabel skal vi følge nedenstående trin:

Trin:1

Opret en ny tom tabel med navnet tblCity_Temp ved at bruge definitionen af ​​den eksisterende tblCity bord. Den nye tabel har en primær nøglekolonne.

Oprettelsesscriptet er som følger:

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

Trin:2

Indsæt dataene i tblCity_Temp tabel fra tblCity tabel:

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

Trin:3

Omdøb tabellerne som vist nedenfor:

  1. Gamle navn: tblCityNyt navn: tblCity_Old.
  2. Gamle navn: tblCity_TempNyt navn: tblCity .

Vær opmærksom på forespørgslen om tabelnavn:

USE codingsight 
go 

EXEC Sp_rename 
  'tblCity', 
  'tblCity_Old' 
go 

EXEC Sp_rename 
  'tblCity_Temp', 
  'tblCity' 
go

Kør nu følgende forespørgsel for at se den nyligt tilføjede primærnøgle:

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  

Oputtet:

Brug forespørgslen til datavisning:

SELECT * FROM tblCity c

Oputtet:

Tilføj udenlandske nøglekolonner til en tabel

Antag, at vi vil tilføje en kolonne med navnet deptID til tblEmployee bord. Kolonnens datatype er INTEGER. Det refererer til afdelings-ID kolonne i tbldepartment tabel.

Forespørgslen er følgende:

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

Kør den næste forespørgsel for at se den nye fremmednøglekolonne:

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   

Oputtet:

Bemærk ER-diagrammet:

På denne måde har vi oprettet en fremmednøgle ved navn FK_DepartmentID .

Tilføj en kolonne med CHECK og DEFAULT Constraint

Lad os nu tilføje en kolonne med navnet minimum_løn til medarbejderen bord. Kolonnens datatype er penge .

minimumslønnen kolonnens værdi skal være større eller lig med 5,60 $. Derfor har vi oprettet check betingelse for at verificere den indsatte værdi – den skal være højere end 5,60$. Desuden standardværdien af kolonnen er 5,60$.

For at tilføje kolonnen skal du køre følgende forespørgsel:

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ølgende fejl opstå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ærdien angivet for minimumsløn kolonne er mindre end 5,6. Det er derfor, forespørgslen har returneret en fejl.

Skift værdien af ​​minimumsløn værdi og udfør forespørgslen igen:

UPDATE tblemployee SET minimum_wages=5.8 WHERE employeeID =5;

Oputtet:

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

Når vi har opdateret posten, skal du køre nedenstående forespørgsel for at se dataene:

Select * from tblemployee where employeeID=5

Oputtet:

For at bekræfte, at standardbegrænsningen virker, skal du køre følgende INSERT-sætning:

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

Når posten er indsat, lad os se dataene:

Forespørgslen:

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

Oputtet:

Jeg har ikke angivet værdien af ​​minimumsløn kolonne. Derfor er standardværdien indsat i tabellen.

Oversigt

Artiklen præciserede essensen af ​​ALTER TABLE ADD COLUMN-sætningen, dens syntaks og forskellige anvendelsestilfælde af implementeringer.

Læs også

Grundlæggende om SQL Server ALTER TABLE-erklæring
Forstå SQL DELETE-kolonne fra tabel
Forstå DROP TABLE HVIS FINDER SQL-sætning


  1. Lær grundlæggende dataanalyse med SQL-vinduefunktioner

  2. Hvordan tilføjes indledende nul i et tal i Oracle SQL-forespørgsel?

  3. Masseindsættelser eller opdatering for tabeller med vedhæftede felter

  4. Escape Character i SQL Server