sql >> Base de Datos >  >> RDS >> Sqlserver

Comprender la instrucción ALTER TABLE ADD COLUMN de SQL Server

Este artículo describe la instrucción ALTER TABLE ADD COLUMN de SQL Server. El propósito de esta declaración es agregar una nueva columna a una tabla existente. Además, el artículo aclarará los siguientes casos de uso:

  1. Añadir múltiples columnas.
  2. Agregue una nueva columna de clave principal.
  3. Agregue una nueva columna de clave externa.
  4. Agregue nuevas columnas que tengan columnas calculadas.
  5. Agregue una nueva columna que tenga restricciones CHECK y UNIQUE.

La especificidad de sintaxis de la sentencia SQL ALTER TABLE ADD COLUMN

Como vamos a explorar la declaración a fondo, comencemos por comprender la sintaxis:

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

Tenga en cuenta los siguientes aspectos:

  1. Debe especificar el nombre de la tabla donde desea agregar una columna después TABLA ALTERADA .
  2. El nombre de la columna o columnas debe ser después de ADD . Para columnas múltiples, separe sus nombres con comas.
  3. Especifique los tipos de datos de columna después del nombre de columna .
  4. Si está agregando cualquier restricción, una clave principal o una clave externa , especifíquelo después del tipo de datos .

Para fines de demostración, he creado una base de datos llamada CodingSight . Allí, he creado tres tablas llamadas tbldepartment , empleado de tble, y tblCity, e insertó datos ficticios en esas tablas.

El siguiente script crea una base de datos y tablas:

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

El siguiente script inserta los datos ficticios en la tabla:

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

Ahora, pasemos a los casos de uso.

Añadir varias columnas a una tabla

En nuestro ejemplo, queremos agregar el Estado y Código PIN columnas a tbleCity mesa. El tipo de datos del Estado la columna es VARCHAR, y la longitud de la columna es 150. El tipo de datos del Pincode columna es ENTERO. Para agregar columnas, ejecute la siguiente consulta:

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

Ahora, ejecute la consulta para ver la lista de columnas de tblCity tabla:

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'

El resultado de la consulta:

Como puede ver, el Estado y Código PIN se han añadido columnas.

Agregar columnas de clave principal a una tabla

Agreguemos la columna Clave principal a tblCity mesa. De acuerdo a los requerimientos del negocio, debemos agregar una columna con una combinación de un carácter y un número de cuatro dígitos para identificar la ciudad.

Estamos agregando una nueva columna llamada City_Code a la tblCity mesa. El tipo de datos del City_Code es varchar, y la longitud es cinco. Ejecute la siguiente consulta para agregar una columna:

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

La salida:

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.

La consulta devuelve un error porque la clave principal debe ser única y no nula. Para agregar una columna a esta tabla, debemos seguir los siguientes pasos:

Paso:1

Cree una nueva tabla vacía llamada tblCity_Temp usando la definición de la tblCity existente mesa. La nueva tabla tiene una columna de clave principal.

El script de creación es el siguiente:

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

Paso:2

Inserte los datos en tblCity_Temp tabla de tblCity tabla:

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

Paso:3

Cambie el nombre de las tablas como se muestra a continuación:

  1. Nombre anterior: tblCiudadNuevo nombre: tblCity_Old.
  2. Nombre anterior: tblCity_TempNuevo nombre: tblCiudad .

Preste atención a la consulta de cambio de nombre de la tabla:

USE codingsight 
go 

EXEC Sp_rename 
  'tblCity', 
  'tblCity_Old' 
go 

EXEC Sp_rename 
  'tblCity_Temp', 
  'tblCity' 
go

Ahora, ejecute la siguiente consulta para ver la clave principal recién agregada:

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  

La salida:

Utilice la consulta para la visualización de datos:

SELECT * FROM tblCity c

La salida:

Agregar columnas de clave foránea a una tabla

Supongamos que queremos agregar una columna llamada deptID al tblEmployee mesa. El tipo de datos de la columna es INTEGER. Hace referencia al departmentID columna del tbldepartment mesa.

La consulta es la siguiente:

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

Ejecute la siguiente consulta para ver la nueva columna de clave externa:

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   

La salida:

Tenga en cuenta el diagrama ER:

De esta forma, hemos creado una clave externa llamada FK_DepartmentID .

Agregar una columna con restricción CHECK y DEFAULT

Ahora, agreguemos una columna llamada salario_mínimo al empleado de tble mesa. El tipo de datos de la columna es dinero .

El salario_mínimo el valor de la columna debe ser mayor o igual a 5.60$. Por lo tanto, hemos creado el cheque condición para verificar el valor insertado – debe ser superior a 5,60$. Además, el valor predeterminado de la columna es 5.60$.

Para agregar la columna, ejecute la siguiente consulta:

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;

Se produce el siguiente error:

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

El valor especificado para los salarios_mínimos columna es inferior a 5,6. Es por eso que la consulta ha devuelto un error.

Cambiar el valor de los salarios_mínimos valor y ejecutar la consulta de nuevo:

UPDATE tblemployee SET minimum_wages=5.8 WHERE employeeID =5;

La salida:

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

Una vez que hayamos actualizado el registro, ejecute la siguiente consulta para ver los datos:

Select * from tblemployee where employeeID=5

La salida:

Para verificar que la restricción predeterminada funciona, ejecute la siguiente instrucción INSERT:

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

Una vez insertado el registro, veamos los datos:

La Consulta:

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

La salida:

No he especificado el valor de los salarios_mínimos columna. Por lo tanto, el valor predeterminado se inserta en la tabla.

Resumen

El artículo aclaró la esencia de la declaración ALTER TABLE ADD COLUMN, su sintaxis y varios casos de uso de implementaciones.

Leer también

Conceptos básicos de la instrucción ALTER TABLE de SQL Server
Comprender la columna SQL DELETE de la tabla
Entendiendo DROP TABLE IF EXISTS Sentencia SQL