sql - una - restricciones de llave primaria
SQL Server 2005: Restricción de clave externa anulable (1)
Parecía recordar haber creado un FK anulable antes, así que realicé una prueba rápida. Como puede ver a continuación, definitivamente es factible (probado en MSSQL 2005).
Guíe las partes relevantes de sus tablas y restricciones y publíquelas para que podamos resolver más problemas.
CREATE DATABASE [NullableFKTest]
GO
USE [NullableFKTest]
GO
CREATE TABLE OneTable
(
OneId [int] NOT NULL,
CONSTRAINT [PK_OneTable] PRIMARY KEY CLUSTERED
(
[OneId] ASC
)
)
CREATE TABLE ManyTable (ManyId [int] IDENTITY(1,1) NOT NULL, OneId [int] NULL)
GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N''[dbo].[FK_ManyTable_OneTable]'') AND parent_object_id = OBJECT_ID(N''[dbo].[ManyTable]'') )
ALTER TABLE [dbo].[ManyTable] WITH CHECK ADD CONSTRAINT [FK_ManyTable_OneTable] FOREIGN KEY([OneId])
REFERENCES [dbo].[OneTable] ([OneId])
GO
--let''s get a value in here
insert into OneTable(OneId) values(1)
select* from OneTable
--let''s try creating a valid relationship to the FK table OneTable
insert into ManyTable(OneId) values (1) --fine
--now, let''s try NULL
insert into ManyTable(OneId) values (NULL) --also fine
--how about a non-existent OneTable entry?
insert into ManyTable(OneId) values (5) --BOOM! - FK violation
select* from ManyTable
--1, 1
--2, NULL
--cleanup
ALTER TABLE ManyTable DROP CONSTRAINT FK_ManyTable_OneTable
GO
drop TABLE OneTable
GO
drop TABLE ManyTable
GO
USE [Master]
GO
DROP DATABASE NullableFKTest
Tengo una restricción de clave externa entre las tablas Sesiones y Usuarios. Específicamente, Sessions.UID = Users.ID. A veces, quiero que Sessions.UID sea nulo. ¿Se puede permitir esto? Cada vez que trato de hacer esto, obtengo una Violación de restricción FK.
Específicamente, estoy insertando una fila en Sesiones a través de LINQ. Configuro la Session.User = null; y obtengo este error:
An attempt was made to remove a relationship between a User and a Session. However, one of the relationship''s foreign keys (Session.UID) cannot be set to null.
Sin embargo, cuando elimino la línea que anula la propiedad del usuario, aparece este error en mi línea SubmitChanges:
Value cannot be null. Parameter name: cons
Ninguna de mis tablas tiene un campo llamado ''contras'', ni está en mi archivo DataContext.designer.cs de 5,500 líneas, ni está en el QuickWatch para ninguno de los objetos relacionados, así que no tengo idea de qué ''contras'' es .
En la base de datos, Session.UID es un campo int nullable y User.ID es una int no anulable. Quiero grabar sesiones que pueden o no tener un UID, y preferiría hacerlo sin deshabilitar la restricción en esa relación FK. ¿Hay alguna forma de hacer esto?