Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zrozumienie instrukcji ALTER TABLE ADD COLUMN w programie SQL Server

W tym artykule opisano instrukcję SQL Server ALTER TABLE ADD COLUMN. Celem tej instrukcji jest dodanie nowej kolumny do istniejącej tabeli. Artykuł wyjaśni również następujące przypadki użycia:

  1. Dodaj wiele kolumn.
  2. Dodaj nową kolumnę klucza podstawowego.
  3. Dodaj nową kolumnę klucza obcego.
  4. Dodaj nowe kolumny, które mają obliczone kolumny.
  5. Dodaj nową kolumnę, która ma ograniczenia CHECK i UNIQUE.

Specyfika składni instrukcji SQL ALTER TABLE ADD COLUMN

Ponieważ zamierzamy dokładnie zbadać to stwierdzenie, zacznijmy od zrozumienia składni:

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

Zwróć uwagę na następujące aspekty:

  1. Musisz określić nazwę tabeli gdzie chcesz dodać kolumnę po ZMIANA TABELI .
  2. Nazwa kolumny lub kolumn musi być po DODAJ . W przypadku wielu kolumn oddziel ich nazwy przecinkami.
  3. Określ typy danych kolumny po nazwie kolumny .
  4. Jeśli dodajesz dowolne ograniczenie, klucz podstawowy lub klucz obcy , określ go po typie danych .

W celach demonstracyjnych stworzyłem bazę danych o nazwie CodingSight . Tam utworzyłem trzy tabele o nazwie tbldepartment , pracownik, i tblCity, i wstawił dane fikcyjne do tych tabel.

Poniższy skrypt tworzy bazę danych i tabele:

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

Poniższy skrypt wstawia fikcyjne dane do tabeli:

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

Przejdźmy teraz do przypadków użycia.

Dodaj wiele kolumn do tabeli

W naszym przykładzie chcemy dodać stan i Kod PIN kolumny do tbleCity stół. Typ danych stanu kolumna to VARCHAR, a długość kolumny to 150. Typ danych Pincode kolumna to INTEGER. Aby dodać kolumny, uruchom następujące zapytanie:

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

Teraz uruchom zapytanie, aby wyświetlić listę kolumn tblCity tabela:

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'

Wyjście zapytania:

Jak widać, Stan i Kod PIN dodano kolumny.

Dodaj kolumny klucza podstawowego do tabeli

Dodajmy kolumnę Klucz podstawowy do tblCity stół. Zgodnie z wymaganiami biznesowymi musimy dodać kolumnę z kombinacją znaku i czterocyfrowej liczby, aby zidentyfikować miasto.

Dodajemy nową kolumnę o nazwie City_Code do tblCity stół. Typ danych City_Code to varchar, a długość to pięć. Uruchom następujące zapytanie, aby dodać kolumnę:

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

Wynik:

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.

Zapytanie zwraca błąd, ponieważ klucz podstawowy musi być unikalny i nie może być pusty. Aby dodać kolumnę do tej tabeli, musimy wykonać następujące kroki:

Krok:1

Utwórz nową pustą tabelę o nazwie tblCity_Temp przy użyciu definicji istniejącego tblCity stół. Nowa tabela ma kolumnę klucza podstawowego.

Skrypt tworzenia wygląda następująco:

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

Krok:2

Wstaw dane do tblCity_Temp tabela z tblCity tabela:

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

Krok:3

Zmień nazwy tabel, jak pokazano poniżej:

  1. Stare imię: tblCityNowa nazwa: tblCity_Old.
  2. Stare imię: tblCity_TempNowa nazwa: tblCity .

Zwróć uwagę na zapytanie zmieniające nazwę tabeli:

USE codingsight 
go 

EXEC Sp_rename 
  'tblCity', 
  'tblCity_Old' 
go 

EXEC Sp_rename 
  'tblCity_Temp', 
  'tblCity' 
go

Teraz uruchom następujące zapytanie, aby wyświetlić nowo dodany klucz podstawowy:

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  

Wynik:

Użyj zapytania do przeglądania danych:

SELECT * FROM tblCity c

Wynik:

Dodaj kolumny klucza obcego do tabeli

Załóżmy, że chcemy dodać kolumnę o nazwie deptID do pracownika tabeli stół. Typ danych kolumny to INTEGER. Odwołuje się do identyfikatora działu kolumna działu tabel tabela.

Zapytanie jest następujące:

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

Uruchom następne zapytanie, aby wyświetlić nową kolumnę klucza obcego:

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   

Wynik:

Zwróć uwagę na diagram ER:

W ten sposób stworzyliśmy klucz obcy o nazwie FK_DepartmentID .

Dodaj kolumnę z ograniczeniem CHECK i DEFAULT

Teraz dodajmy kolumnę o nazwie minimum_wages do pracownika pracownika stół. Typ danych kolumny to pieniądze .

minimalne_wynagrodzenie wartość kolumny musi być większa lub równa 5,60 $. Dlatego stworzyliśmy czek warunek weryfikacji wprowadzonej wartości – musi być wyższa niż 5,60$. Ponadto wartość domyślna kolumny to 5,60$.

Aby dodać kolumnę, uruchom następujące zapytanie:

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;

Wystąpił następujący błąd:

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

Wartość określona dla minimum_wages kolumna jest mniejsza niż 5,6. Dlatego zapytanie zwróciło błąd.

Zmień wartość minimum_wages wartość i ponownie wykonaj zapytanie:

UPDATE tblemployee SET minimum_wages=5.8 WHERE employeeID =5;

Wynik:

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

Po zaktualizowaniu rekordu uruchom poniższe zapytanie, aby wyświetlić dane:

Select * from tblemployee where employeeID=5

Wynik:

Aby sprawdzić, czy domyślne ograniczenie działa, uruchom następującą instrukcję INSERT:

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

Po wstawieniu rekordu przejrzyjmy dane:

Zapytanie:

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

Wynik:

Nie określiłem wartości minimalnej_wypłaty kolumna. Dlatego do tabeli wstawiana jest wartość domyślna.

Podsumowanie

Artykuł wyjaśnił istotę instrukcji ALTER TABLE ADD COLUMN, jej składnię i różne przypadki użycia implementacji.

Czytaj także

Podstawy SQL Server Instrukcja ALTER TABLE
Zrozumienie kolumny SQL DELETE z tabeli
Zrozumienie instrukcji SQL DROP TABLE IF EXISTS


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Co to jest impas w SQL Server?

  2. Jak pisać znaki UTF-8 za pomocą wstawiania zbiorczego w programie SQL Server?

  3. Dziennik transakcji dla bazy danych jest pełny

  4. Oto trzy powody, dla których możesz zauważyć szczytową aktywność w swojej instancji SQL

  5. Indeksy SQL Server:kluczowe wymagania, wpływ na wydajność i uwagi