2012-02-08 15 views
6

Tengo dos tablas construidas como esto (esto es sólo un ejemplo simplificado y no propietaria):Agregar una clave foránea que admite nulos.

Person Table 
----------- 
p_Id, f_name, l_name 

Job Table 
---------- 
job_Id, job_desc 

Quiero añadir una columna de clave externa, Persons.job_Id, que puede ser anulable que las referencias de empleo. Id_trabajo (PK) La razón es que el trabajo no se conoce de antemano, por lo que podría ser nulo. Tener un "Otro" no es una opción.

Tuve esto hasta el momento, pero me aparece "no se pudo crear la restricción".

ALTER TABLE dbo.Person 
ADD job_Id INT FOREIGN KEY (job_Id) REFERENCES dbo.Job(job_Id) 

Gracias de antemano.

+0

hacer el tipo de datos del partido 2 columnas? –

+0

Necesitan to.Job_Id es una columna de Identidad de ints secuenciales. – Yatrix

+0

¿Alguien quiere decir por qué votaron negativamente, así que puedo cambiar la pregunta para mejorarla y/o aprender de mi error? – Yatrix

Respuesta

12

Pruébalo en dos pasos:

ALTER TABLE dbo.Person ADD job_Id INT NULL; 
ALTER TABLE dbo.Person ADD CONSTRAINT FL_JOB 
FOREIGN KEY (job_Id) REFERENCES dbo.Job(job_Id); 
+6

'ALTER TABLE dbo.Person ADD job_Id INT NULL, CONSTRAINT FL_JOB FOREIGN KEY (job_Id) REFERENCIAS dbo.Job (job_Id);' funciona también para hacerlo en una declaración. –

+1

@MartinSmith: claro, soy un poco viejo en estas cosas y realmente me gusta hacerlas de a una por vez, pero es muy bueno hacerlo también. – Mithrandir

+0

Entonces, creé la tabla de trabajo originalmente y luego tuve que volver a crearla. Cuando lo recreé, me olvidé de crear la clave principal ... maldición. Gracias por toda la ayuda. – Yatrix

8

Pruébalo así, con NOCHECK:

ALTER TABLE dbo.Person ADD job_Id INT NULL; 
ALTER TABLE dbo.Person WITH NOCHECK ADD CONSTRAINT FL_JOB 
FOREIGN KEY (job_Id) REFERENCES dbo.Job(job_Id); 
+0

WITH NOCHECK ayuda cuando Foreign Key podría ser NULO –

+0

Al mirar esta [respuesta] (http://stackoverflow.com/a/1338565/755977), parece que podría haber efectos secundarios en el rendimiento. ¿Es esto obligatorio? – PhilDulac

Cuestiones relacionadas