Bases de Datos > SQL Server
CLAVE PRIMARIA ACEPTA VALORES NULOS
elpipo:
Hola soy un principiante que le gusta mucho la programación, he instalado Sql Server 2008 enterprise, para crear bases de datos y realizar consultas, encontrandome con la sorpresa que la clave primaria sea del tipo de datos que sea y creada en modo grafico o modo comando acepta valor en blanco o nulo, resultando muy extraño por lo que me encomiendo a vosotros para buscar una explicacion, tambien he instaldo sql server 2005 y tambien pasa lo mismo al crear una base de datos la clave primaria acepta valor null y blanco solamente una vez por si intentas introducir valor null una segunda vez te dice que no puede tener valores duplicados, lo mismo pasa con los blancos.
Gracias
F_Tanori:
Hola.
En relidad no ses posible que una llave primaria acepte valores nulos,
--- Cita de: "wikipedia" ---
La mayor diferencia es que para claves únicas, no se impone automáticamente la restricción implícita NOT NULL, mientras que para claves primarias, sí. Así, los valores en columnas de clave única pueden o no ser NULL.
--- Fin de la cita ---
http://es.wikipedia.org/wiki/Clave_primaria
Ahora hay que entender que NULL es es un valor especial que representa a un valor desconocido o una ausencia de valor, pero no significa que NULL sea una cadena vacia, tampoco es un 0. estos valores son al convertirse ya a un tipo de dato; vacio para texto , cero para numericos
pero Una cadena vacia es un valor perfectamente valido para una llave primaria (obviamente en tipos de datos texto)
Si SQL te esta permitiendo introduccir NULL en una clave primaria entonces
La llave no ha sido definida correctamente
o puede ser que estes confundiendo una llave primaria con una llave unica, usando la interfaz visual intenta hacer un campo llave primaria y seleccionando Allow Null
Puedes mostrar la estructura de tu tabla?
Saludos
elpipo:
Hola la Base de datos se llama ESCUELA, la tabla ALUMNO y los campos de esta tabla son:
NOMBRE(PK, Char(10), NO NULL)
DNI(Char(10),NO NULL)
CP(Char(10), NO NULL)
Te lo describo tal cual me lo define Sql Server cuando despliegas COLUMNAS dentro del explorador de Objetos
Bueno pues si yo me voy a consultas y ejecuto:
INSERT INTO ALUMNO(NOMBRE,DNI,CP)
VALUES('NULL','','')
Aqui me dice 1 filas afectadas
Por lo que la consulta se ha ejecutado correctamente
Hago:
SELECT * FROM ALUMNO
Y exactamente NOMBRE tiene NULL y los demas en blanco.
Si necesitas algo mas me dices que estoy super interesado en dar con la solucion
Gracias
F_Tanori:
Muy bien mira
supongo que lo anotaste en una especie de pseudocodigo, para explicar tu tabla
--- Código: SQL ---NOMBRE(PK, CHAR(10), NO NULL)DNI(CHAR(10),NO NULL)CP(CHAR(10), NO NULL)
La sintaxis de esta idea por ejemplo es:
--- Código: SQL --- CREATE TABLE ALUMNOS2 ( NOMBRE CHAR(80) PRIMARY KEY NOT NULL, DNI CHAR(40) NOT NULL, CP CHAR(10) NOT NULL);
Lo que tu haces aqui es insertar la palabra NULL (una cadena perfectamente valida)
--- Código: SQL ---INSERT INTO ALUMNO(NOMBRE,DNI,CP) VALUES('NULL','','')
--- Código: SQL ---INSERT INTO ALUMNO(NOMBRE,DNI,CP) VALUES('VACIO','','')
si creas la tabla Alumnos2 (sintaxis arriba) e intentas lo siguiente ( Atencion! : NULL es un valor especial como ya lo hemos comentado en el mensaje anterior y el sistema lo reconoce como tal, Tercera Regla de Edgar F. Codd (http://es.wikipedia.org/wiki/Sistema_de ... ores_nulos)
y por lo tanto NULL no debes de encerrarlo entre comillas, porque el sistema entiende que se trata de una cadena y no de el valor de NULL, intenta asi
--- Código: SQL ---INSERT INTO ALUMNOS2(NOMBRE,DNI,CP) VALUES(NULL,'','')
--- Cita de: "SQL SERVER 2005" ---Msg 515, Level 16, State 2, Line 1
No se puede insertar el valor NULL en la columna 'NOMBRE', tabla 'ALUMNOS2'. La columna no admite valores NULL. Error de INSERT.
Se terminó la instrucción.
--- Fin de la cita ---
Otros ejemplos con algunas variables y funciones (!Ojo! con las comillas):
--- Código: SQL ---INSERT INTO ALUMNOS2(NOMBRE,DNI,CP) VALUES('@@ServerName','','')
--- Código: SQL ---INSERT INTO ALUMNOS2(NOMBRE,DNI,CP) VALUES(@@ServerName,'','')
--- Código: SQL ---INSERT INTO ALUMNOS2(NOMBRE,DNI,CP) VALUES('Left(db_Name()+XXX,3)','','')
--- Código: SQL ---INSERT INTO ALUMNOS2(NOMBRE,DNI,CP) VALUES(LEFT(db_Name()+'XXX',3),'','')
Si intentas insertar un valor nulo en los otros campos, no te dejaria y no porque sean parte de la llave primaria (Primary Key) sino porque se les ha negado
permitir valores nulos (Allow Nulls) (NOT NULL)
--- Código: SQL ---INSERT INTO ALUMNOS2(NOMBRE,DNI,CP) VALUES(@@ServerName,NULL,'')
Conclusion lo que estas insertando es una cadena con la palabra 'NULL' y no el valor real de NULL
Espero que se aclare tu duda.
Saludos
elpipo:
Hola muchisiiiiiiiiiiiiiimasssss gracias por la aclaración ya me extrañaba que sql server estuviera mal, el que esta mal de verdad soy yo que estoy hecho un cazurro, vuelvo a repetiros que muchísimas gracias me habéis salvado de muchos atascos que me he liado yo.
Otra pregunta que hago ya que tengo solucionado el problema gordo es como puedo poner un restricción en las columnas que no sean claves primarias para que no acepten blancos, por que en la clave primaria ya lo he puesto en el apartado de restricciones pero no me deja crear un restricción en las demás columnas solo en la clave primaria si me pudierais ayudar en esto lo agradecería, y por ultimo si tuvierais un buen manual de instalacion y utilizacion de SQL SERVER 2008 enterprise que es el que tengo tambien lo agradeceria.
De todas formas muchas gracias.
Navegación
[#] Página Siguiente
Ir a la versión completa