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.
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.
Ejemplo. Crear un unique constraint desde la creación de la tabla CLIENTE
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
Ejemplo: Crear un check constraint desde la creación de la tabla CLIENTE
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
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
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
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).
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.
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!