31 enero, 2020

Constraints (Restricciones)

USO DE LOS CONSTRAINTS (RESTRICCIONES)

Para asegurar la integrar de los datos almacenados en nuestras tablas, podemos crear los famosos constraints (restricciones), lo cuales nos van a permitir  limitar el tipo de dato que puede insertarse en una tabla.

Dichas restricciones pueden especificarse cuando la tabla se crea por primera vez a través de la instrucción CREATE TABLE, o luego de crear la tabla a través de la instrucción ALTER TABLE.

Los diferentes tipos de restricción que existen son:
  • PRIMARY KEY (esta ya la hemos visto y permite identificar cada fila de una tabla como única)
  • FOREIGN KEY (esta también la hemos visto y sirve como enlace hacia otra tabla donde en esta última, dicho enlace son la o las columnas que forman la PRIMARY KEY.)
  • UNIQUE
  • CHECK
  • DEFAULT


CASO: COMIDAS CIBER

Creamos la base de datos COMIDASCIBER y creamos las siguientes tablas


Solución

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*************************************************************************/
/* Creamos la base de datos COMIDASCIBER y creamos las siguientes tablas */
/*************************************************************************/
 
-- Crea la base de datos
CREATE DATABASE COMIDASCIBER
GO
 
 
-- Activa la base de datos
USE COMIDASCIBER
GO
 
-- Crea las tablas
CREATE TABLE CLIENTE (
  COD_CLI CHAR(5) NOT NULL PRIMARY KEY,
  NOM_CLI VARCHAR(50),
  APE_PAT_CLI VARCHAR(50),
  FEC_NAC_CLI DATETIME,
  DNI_CLI CHAR(8),
  DIR_CLI VARCHAR(50),
  SEX_CLI CHAR(1),
  GAS_MEN_CLI DECIMAL(9, 2)
)
 
CREATE TABLE COMIDA (
  COD_COMI CHAR(5) NOT NULL PRIMARY KEY,
  DES_COMI VARCHAR(20),
  PRE_COMI DECIMAL(9, 2)
)
 
CREATE TABLE INGREDIENTE (
  COD_ING CHAR(5) NOT NULL PRIMARY KEY,
  DES_ING VARCHAR(20),
  TIP_ING VARCHAR(30),
  FEC_INGRE_ING DATETIME,
  RAZ_PRO_ING VARCHAR(20),
  RUC_PRO_ING CHAR(11)
)
 
CREATE TABLE COMPROBANTE (
  NRO_COMP INT IDENTITY (100, 1) NOT NULL PRIMARY KEY,
  FEC_COMP DATETIME,
  COD_VEND CHAR(5),
  IGV_COMP DECIMAL(9, 2),
  MON_TOT_COMP DECIMAL(9, 2),
  COD_CLI CHAR(5) REFERENCES CLIENTE
)
 
CREATE TABLE DETALLE_COMPROBANTE (
  NRO_COMP INT NOT NULL REFERENCES COMPROBANTE,
  COD_COMI CHAR(5) NOT NULL REFERENCES COMIDA,
  CAN_VEN INT,
  MON_PAR DECIMAL(9, 2),
  PRIMARY KEY (NRO_COMP, COD_COMI)
)
 
CREATE TABLE DETALLE_COMIDA (
  COD_COMI CHAR(5) NOT NULL REFERENCES COMIDA,
  COD_ING CHAR(5) NOT NULL REFERENCES INGREDIENTE,
  CANT_ING INT PRIMARY KEY (COD_COMI, COD_ING)
)
GO

No se preocupen si no tienen instalado el SQL Server, mi objetivo es que ustedes aprendan y practiquen asi no tengan esta herramienta. Por lo tanto, podemos recurrir a un editor de SQL online que soporte MS SQL Server. Yo les comparto uno que me gusta mucho usarlo para mis ejemplos. https://rextester.com/

REXTEXTER

Aunque tenga sus limitaciones es muy sencilla de usar, solo tienen que pegar el query en el editor y ejecutarlo haciendo clic en el botón Runt it (F8).

Mi recomendación es que cuando tengan muchas instrucciones combinadas (insert, delete, update, select, create, alter, drop, etc), ejecuten parte por parte del código comentando las partes que no necesitan en ese momento. OJO: Pero siempre debe colocarse el código que crea la tablas y los registros antes de cualquier operación, ya que el sistema no guarda la base de datos y no podemos usar el comando USE NOMBRE_BASE DATOS para activar la base de datos y a partir de ello comenzar a hacer consultas, por lo tanto, el código que crea las tablas y los registros siempre deben estar antes de realizar cualquier operación y debe ejecutarse todo, ya que RexTexter no permite seleccionar un extracto de código para compilar solo esa parte, la aplicación ejecuta todo lo que esta en el editor. Pero a pesar de todo ello, es muy buena.


Ingresa al siguiente enlace y ejecuta el script: https://rextester.com/FNK47023


1. DEFINICIÓN Y USO DEL UNIQUE CONSTRAINT

La restricción UNIQUE identifica de forma exclusiva cada registro en una tabla de base de datos. Las restricciones de CLAVE ÚNICA y PRIMARIA proporcionan una garantía de unicidad para una columna o conjunto de columnas. Una restricción PRIMARY KEY tiene automáticamente una restricción UNIQUE definida en ella. Tenga en cuenta que puede tener muchas restricciones ÚNICAS por tabla, pero solo una restricción PRIMARY KEY por tabla. 

La restricción UNIQUE se puede añadir a una columna de una tabla, después de ser creada, mediante la sentencia ALTER TABLE.


Ejemplo: Crear un unique constraint que valide o impida duplicar el dni de un cliente, para ello deberá modificar la tabla CLIENTES.


Clic en enlace para ejecutar el query: https://rextester.com/MMQDT86152

Ejemplo. Crear un unique constraint desde la creación de la tabla CLIENTE


Clic en enlace para ejecutar el query: https://rextester.com/JNBJ60505

2. DEFINICIÓN Y USO DEL CHECK CONSTRAINT

Es importante imponer la integridad de dominio, asegurar que sólo puedan existir entradas de los tipos o rangos esperados para una columna determinada). SQL Server impone la integridad de dominio a través del Check Constraint.

Una columna puede tener cualquier número de restricciones CHECK y la condición puede incluir varias expresiones lógicas combinadas con AND y OR. Por ello, las restricciones CHECK para una columna se validan en el orden en que se crean.

La condición de búsqueda debe dar como resultado una expresión booleana y no puede hacer referencia a otra tabla.
Una restricción CHECK, en el nivel de columna, sólo puede hacer referencia a la columna restringida y una restricción CHECK, en el nivel de tabla, sólo puede hacer referencia a columnas de la misma tabla.

Las restricciones CHECK y las reglas sirven para la misma función de validación de los datos durante las instrucciones INSERT y DELETE.

Cuando hay una regla y una o más restricciones CHECK para una columna o columnas, se evalúan todas las restricciones.


Ejemplo: Crear un check constraint que valide que el sexo del cliente solo sea F de femenino o M de masculino

Clic en enlace para ejecutar el query: https://rextester.com/edit/LYF35916

Ejemplo: Crear un check constraint desde la creación de la tabla CLIENTE


Clic en enlace para ejecutar el query: https://rextester.com/DKBW58212

3. DEFINICIÓN Y USO DEL DEFAULT CONSTRAINT

La restricción DEFAULT se usa para proporcionar un valor predeterminado para una columna. El valor predeterminado se agregará a todos los registros nuevos SI no se especifica ningún otro valor.
La restricción DEFAULT se puede añadir a una columna de una tabla, después de ser creada, mediante la sentencia ALTER TABLE.


Ejemplo: Crear un default constraint que establezca un valor por defecto a la columna dirección

Clic en enlace para ejecutar el query: https://rextester.com/QIHDB17943

Ejemplo: Crear un default constraint desde la creación de la tabla CLIENTE

Clic en enlace para ejecutar el query: https://rextester.com/LICXE38272

Verificando el campo INDENTIDAD-IDENTITY de la tabla COMPROBANTE


Clic en enlace para ejecutar el query: https://rextester.com/JUKCZ66555

Eliminar Constraints de la tabla


Clic en enlace para ejecutar el query: https://rextester.com/FMAWX50346

DEFINICIÓN Y USO DEL IDENTITY

Crea una columna de identidad en una tabla. Esta propiedad se usa con las instrucciones CREATE TABLE y ALTER TABLE de Transact-SQL. 

Debe especificar tanto el valor de inicialización como el incremento, o bien ninguno de los dos. Si no se especifica ninguno, el valor predeterminado es (1,1).


Ejemplo: Se activa la base de datos Ventas que creamos en el post anterior; luego, se verifica si existe la tabla new_empleados para eliminarla y proceder a su creación.


Ejecuta la solución en RexTexter: https://rextester.com/XGW43433

Script completo


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
/*************************************************************************/
/* Creamos la base de datos COMIDASCIBER y creamos las siguientes tablas */
/*************************************************************************/
 
-- Crea la base de datos
CREATE DATABASE COMIDASCIBER
GO
 
 
-- Activa la base de datos
USE COMIDASCIBER
GO
 
-- Crea las tablas
CREATE TABLE CLIENTE (
  COD_CLI CHAR(5) NOT NULL PRIMARY KEY,
  NOM_CLI VARCHAR(50),
  APE_PAT_CLI VARCHAR(50),
  FEC_NAC_CLI DATETIME,
  DNI_CLI CHAR(8),
  DIR_CLI VARCHAR(50),
  SEX_CLI CHAR(1),
  GAS_MEN_CLI DECIMAL(9, 2)
)
 
CREATE TABLE COMIDA (
  COD_COMI CHAR(5) NOT NULL PRIMARY KEY,
  DES_COMI VARCHAR(20),
  PRE_COMI DECIMAL(9, 2)
)
 
CREATE TABLE INGREDIENTE (
  COD_ING CHAR(5) NOT NULL PRIMARY KEY,
  DES_ING VARCHAR(20),
  TIP_ING VARCHAR(30),
  FEC_INGRE_ING DATETIME,
  RAZ_PRO_ING VARCHAR(20),
  RUC_PRO_ING CHAR(11)
)
 
CREATE TABLE COMPROBANTE (
  NRO_COMP INT IDENTITY (100, 1) NOT NULL PRIMARY KEY,
  FEC_COMP DATETIME,
  COD_VEND CHAR(5),
  IGV_COMP DECIMAL(9, 2),
  MON_TOT_COMP DECIMAL(9, 2),
  COD_CLI CHAR(5) REFERENCES CLIENTE
)
 
CREATE TABLE DETALLE_COMPROBANTE (
  NRO_COMP INT NOT NULL REFERENCES COMPROBANTE,
  COD_COMI CHAR(5) NOT NULL REFERENCES COMIDA,
  CAN_VEN INT,
  MON_PAR DECIMAL(9, 2),
  PRIMARY KEY (NRO_COMP, COD_COMI)
)
 
CREATE TABLE DETALLE_COMIDA (
  COD_COMI CHAR(5) NOT NULL REFERENCES COMIDA,
  COD_ING CHAR(5) NOT NULL REFERENCES INGREDIENTE,
  CANT_ING INT PRIMARY KEY (COD_COMI, COD_ING)
)
GO
 
 
/*=============================*/
/* Constraints (Restricciones) */
/*=============================*/
 
 
/* PARTE 1 - USO DEL CONSTRAINT UNIQUE */
 
/* 1. Crear un unique constraint que impida duplicar el dni de un cliente */
 
 --  Agregamos una restricción única en la columna "DNI_CLI"
 ALTER TABLE CLIENTE
 ADD CONSTRAINT U_DNI_CLI
 UNIQUE (DNI_CLI)
 GO
 
 -- Verificamos el constraint creado en la tabla
 EXEC sp_helpconstraint CLIENTE
 GO
 
 -- Insertamos 2 registros con el dni duplicado
 INSERT INTO CLIENTE
 VALUES ('C0001', 'JUANA', 'DE ARCO', '2/1/2020', '58585847', 'AV. LOS RISOS 123', 'F', 10.23)
 INSERT INTO CLIENTE
 VALUES ('C0002', 'JOSÉ', 'MORALES', '4/2/2020', '58585847', 'AV. LA ENCALADA 324', 'M', 10.23)
 GO
 
 -- Solo se insertó un registro
 SELECT * FROM CLIENTE
 GO
 
/* 2.  Crear un unique constraint desde la creación de la tabla cliente */
 
 -- Se crea la tabla cliente2 con el unique constraint
 CREATE TABLE CLIENTE2 (
   COD_CLI CHAR(5) NOT NULL PRIMARY KEY,
   NOM_CLI VARCHAR(50),
   APE_PAT_CLI VARCHAR(50),
   FEC_NAC_CLI DATETIME,
   DNI_CLI CHAR(8),
   DIR_CLI VARCHAR(50),
   SEX_CLI CHAR(1),
   GAS_MEN_CLI DECIMAL(9, 2)
   cONSTRAINT UNIQUE_DNI_CLI UNIQUE (DNI_CLI)
 )
 
 -- Verificamos el constraint creado en la tabla
 EXEC sp_helpconstraint CLIENTE2
 GO
 
 -- Insertamos 2 registros con el dni duplicado
 INSERT INTO CLIENTE2
 VALUES ('C0001', 'JUANA', 'DE ARCO', '2/1/2020', '58585847', 'AV. LOS RISOS 123', 'F', 10.23)
 INSERT INTO CLIENTE2
 VALUES ('C0002', 'JOSÉ', 'MORALES', '4/2/2020', '58585847', 'AV. LA ENCALADA 324', 'M', 10.23)
 GO
 
 -- Solo se insertó un registro
 SELECT * FROM CLIENTE2
 GO
 
 
 
/* PARTE 2 - USO DEL CONSTRAINT CHECK */
 
/* 1. Crear un check constraint que valide que el sexo del cliente solo sea F o M */
 
 -- Se agrega el check contraint a la tabla cliente
 ALTER TABLE CLIENTE
 ADD CONSTRAINT CK_SEXO_CLI
 CHECK (SEX_CLI IN ('F', 'M'))
 GO
 
 -- Verificamos el constraint creado en la tabla
 EXEC sp_helpconstraint CLIENTE
 GO
 
 -- Insertamos 3 registros, uno de ellos tiene un sexo diferente de F y M
 INSERT INTO CLIENTE (COD_CLI, NOM_CLI, APE_PAT_CLI, FEC_NAC_CLI, DNI_CLI, DIR_CLI, SEX_CLI, GAS_MEN_CLI)
 VALUES ('C0003', 'LUIS', 'VELA', '2/2/2020', '12354778', 'LOS SAUCES 123', 'M', 100.23)
 INSERT INTO CLIENTE
 VALUES ('C0004', 'JUANA', 'DE ARCO', '2/2/2020', '12333778', 'LOS FEOS 123', 'Femenino', 10.23)
 INSERT INTO CLIENTE (COD_CLI, NOM_CLI, APE_PAT_CLI, DNI_CLI, SEX_CLI)
 VALUES ('C0005', 'LUISA', 'LEIN', '45879521', 'F')
 GO
 
 -- Sólo se insertaron 2 registros
 SELECT * FROM CLIENTE
 GO
 
 
/* 2.  Crear un check constraint desde la creación de la tabla cliente */
 
 -- Se crea la tabla cliente3
 CREATE TABLE CLIENTE3 (
   COD_CLI CHAR(5) NOT NULL PRIMARY KEY,
   NOM_CLI VARCHAR(50),
   APE_PAT_CLI VARCHAR(50),
   FEC_NAC_CLI DATETIME,
   DNI_CLI CHAR(8),
   DIR_CLI VARCHAR(50),
   SEX_CLI CHAR(1) CHECK (SEX_CLI IN ('F', 'M')),
   GAS_MEN_CLI DECIMAL(9, 2)
 )
 
 -- Verificamos el constraint creado en la tabla
 EXEC sp_helpconstraint CLIENTE3
 GO
 
 -- Insertamos 3 registros
 INSERT INTO CLIENTE3 (COD_CLI, NOM_CLI, APE_PAT_CLI, FEC_NAC_CLI, DNI_CLI, DIR_CLI, SEX_CLI, GAS_MEN_CLI)
 VALUES ('C0001', 'LUIS', 'VELA', '2/2/2020', '12354778', 'LOS SAUCES 123', 'M', 100.23)
 INSERT INTO CLIENTE3
 VALUES ('C0002', 'JUANA', 'DE ARCO', '2/2/2020', '12333778', 'LOS FEOS 123', 'Femenino', 10.23)
 INSERT INTO CLIENTE3 (COD_CLI, NOM_CLI, APE_PAT_CLI, DNI_CLI, SEX_CLI)
 VALUES ('C0003', 'LUISA', 'LEIN', '45879521', 'F')
 GO
 
 -- Sólo se insertaron 2 registros
 SELECT * FROM CLIENTE3
 GO
 
 
 
/* PARTE 3 - USO DEL CONSTRAINT DEFAULT */
 
/* 1. Crear un default constraint que establezca un valor por defecto a la columna dirección */
 
 -- Se agrega el check contraint a la tabla cliente
 ALTER TABLE CLIENTE
 ADD CONSTRAINT DF_DIR_CLI
 DEFAULT 'DESCONOCIDO' FOR DIR_CLI
 GO
 
 -- Verificamos el constraint creado en la tabla
 EXEC sp_helpconstraint CLIENTE
 GO
 
 -- Insertamos un cliente sin especificar el campo dirección
 INSERT INTO CLIENTE (COD_CLI, NOM_CLI, APE_PAT_CLI, FEC_NAC_CLI, DNI_CLI, SEX_CLI, GAS_MEN_CLI)
 VALUES ('C0006', 'LUIS', 'VELA', '2/2/2020', '65678981', 'M', 100.23)
 GO
 
 -- Se insertó 1 registro
 SELECT  * FROM CLIENTE WHERE COD_CLI = 'C0006'
 
 
/* 2.  Crear un default constraint desde la creación de la tabla cliente */
 
 -- Se crea la tabla cliente4
 CREATE TABLE CLIENTE4 (
   COD_CLI CHAR(5) NOT NULL PRIMARY KEY,
   NOM_CLI VARCHAR(50),
   APE_PAT_CLI VARCHAR(50),
   FEC_NAC_CLI DATETIME,
   DNI_CLI CHAR(8),
   DIR_CLI VARCHAR(50) default 'DESCONOCIDO',
   SEX_CLI CHAR(1),
   GAS_MEN_CLI DECIMAL(9, 2)
 )
 
 -- Verificamos el constraint creado en la tabla
 EXEC sp_helpconstraint CLIENTE4
 GO
 
 -- Insertamos un cliente sin especificar el campo dirección
 INSERT INTO CLIENTE4 (COD_CLI, NOM_CLI, APE_PAT_CLI, FEC_NAC_CLI, DNI_CLI, SEX_CLI, GAS_MEN_CLI)
 VALUES ('C0006', 'LUIS', 'VELA', '2/2/2020', '65678981', 'M', 100.23)
 GO
 
 -- Se insertó 1 registro
 SELECT  * FROM CLIENTE4
 GO
 
 
/*******************************************/
/* VERIFICANDO EL CAMPO IDENTIDAD=IDENTITY */
/*******************************************/
 
-- Insertamos 2 registros en la tabla comprobante sin especificar el número de comprobante, ya que
-- este será autogenerado en uno en uno empezando por 100.
INSERT INTO COMPROBANTE (FEC_COMP, COD_VEND, IGV_COMP, MON_TOT_COMP, COD_CLI)
VALUES ('16/10/2020', 'V0001', 12.10, 132.25, 'C0001')
INSERT INTO COMPROBANTE (FEC_COMP, COD_VEND, IGV_COMP, MON_TOT_COMP, COD_CLI)
VALUES ('16/10/2020', 'V0001', 12.10, 132.25, 'C0003')
GO
 
-- Se insertaron 2 registros
SELECT * FROM COMPROBANTE
GO
 
 
 
 
/************************/
/* ELIMINAR CONSTRAINTS */
/************************/
 
ALTER TABLE CLIENTE
DROP CONSTRAINT U_DNI_CLI
ALTER TABLE CLIENTE
DROP CONSTRAINT CK_SEXO_CLI
ALTER TABLE CLIENTE
DROP CONSTRAINT DF_DIR_CLI
GO

Ejecuta la solución en RexTexter: https://rextester.com/POT83991

Si queremos ver las restricciones en la base de datos, debemos actualizar la carpeta base de datos y entramos a la tabla CLIENTE para ver las restricciones que le acabamos de crear.


¡Acabas de ver el tema Constraints del curso de Base de Datos en SQL Server! ¡Fácil verdad! Ir al índice

Asimismo, si quieres comprar la guía completa con todos los temas, ejercicios, evaluaciones, proyectos, aplicaciones, banco de datos y más; puedes ingresar al siguiente enlace. Y si eres seguidor accedes a un descuento del -%50.

¡Quiero esto!

No hay comentarios, ¡cuéntame algo!

Me gustaría saber tu opinión. ¡Saludos!