Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Разбиране на SQL Server ALTER TABLE ADD COLUMN Инструкция

Тази статия описва оператора ALTER TABLE ADD COLUMN на SQL Server. Целта на това изявление е да добави нова колона към съществуваща таблица. Също така, статията ще изясни следните случаи на употреба:

  1. Добавяне на няколко колони.
  2. Добавете нова колона с първичен ключ.
  3. Добавете нова колона с външен ключ.
  4. Добавете нови колони, които имат изчислени колони.
  5. Добавете нова колона, която има ограничения CHECK и UNIQUE.

Специфичността на синтаксиса на SQL ALTER TABLE ADD COLUMN оператор

Тъй като ще проучим задълбочено изявлението, нека започнем с разбирането на синтаксиса:

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

Обърнете внимание на следните аспекти:

  1. Трябва да посочите името на таблицата където искате да добавите колона след СМЕНА ТАБЛИЦА .
  2. Името на колоната или колоните трябва да е след ДОБАВЯНЕ . За няколко колони отделете имената им със запетаи.
  3. Посочете типовете данни за колони след името на колоната .
  4. Ако добавяте някакво ограничение, първичен ключ или външен ключ , посочете го след типа данни .

За демонстрационни цели създадох база данни с име CodingSight . Там създадох три таблици с име tbldepartment ,служител, и 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. Типът данни на Pincode колоната е 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 маса. Съгласно бизнес изискванията трябва да добавим колона с комбинация от знак и четирицифрено число, за да идентифицираме града.

Добавяме нова колона с име City_Code доtblCity маса. Типът данни на City_Code е varchar, а дължината е пет. Изпълнете следната заявка, за да добавите колона:

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.

Заявката връща грешка, тъй като първичният ключ трябва да е уникален, а не нулев. За да добавим колона към тази таблица, трябва да изпълним следните стъпки:

Стъпка: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

Преименувайте таблиците, както е показано по-долу:

  1. Старо име: tblCityНово име: tblCity_Old.
  2. Старо име: 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 .

Добавете колона с ПРОВЕРКА и Ограничение ПО ПОДРАЗБИРАНЕ

Сега нека добавим колона с име minimum_wages дослужитела маса. Типът данни на колоната е пари .

минималната_заплата Стойността на колоната трябва да е по-голяма или равна на 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, неговия синтаксис и различни случаи на използване на имплементации.

Прочетете също

Основи на оператора ALTER TABLE на SQL Server
Разбиране на SQL DELETE Колона от таблица
Разбиране на DROP TABLE IF EXISTS SQL оператор


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изключете временно ограниченията (MS SQL)

  2. Минали ли са първичните ключове?

  3. Трябва ли да проектирам таблица с първичен ключ varchar или int?

  4. Вземете списък с всички нулеви и ненулеви колони в базата данни на SQL Server - SQL Server / T-SQL урок, част 53

  5. FILE_ID() срещу FILE_IDEX() в SQL Server:Каква е разликата?