Saltar al contenido

Cómo crear una relación uno a uno real en SQL Server

Nuestros mejores investigadores han agotado sus reservas de café, en su búsqueda diariamente por la resolución, hasta que Armando halló el resultado en GitHub y ahora la compartimos con nosotros.

Solución:

Establecer el extranjero key como primario keyy luego establezca la relación en ambos primarios key campos. ¡Eso es todo! Deberías ver un key firmar en ambos extremos de la línea de relación. Esto representa un uno a uno.

ingrese la descripción de la imagen aquí

Verifique esto: Diseño de base de datos de SQL Server con una relación uno a uno

Estoy bastante seguro de que es técnicamente imposible en SQL Server tener una relación Verdadera 1 a 1, ya que eso significaría que tener para insertar ambos registros al mismo tiempo (de lo contrario, obtendría un error de restricción al insertar), en ambas tablas, con ambas tablas teniendo un key relación entre sí.

Dicho esto, el diseño de su base de datos descrito con un extranjero key es una relación de 1 a 0..1. No hay restricción posible que requiera un registro en la tabla B. Puede tener una pseudo-relación con un disparador que crea el registro en la tablaB.

Así que hay algunas pseudo-soluciones

Primero, almacene todos los datos en una sola tabla. Entonces no tendrás problemas en EF.

O En segundo lugar, su entidad debe ser lo suficientemente inteligente como para no permitir una inserción a menos que tenga un registro asociado.

O en tercer lugar, y lo más probable, tiene un problema que está tratando de resolver y nos está preguntando por qué su solución no funciona en lugar del problema real que está tratando de resolver (un problema XY).

ACTUALIZAR

para explicar en LA REALIDAD cómo las relaciones 1 a 1 no funcionan, utilizaré la analogía del dilema del huevo o la gallina. No tengo la intención de resolver este dilema, pero si tuviera una restricción que dice que para agregar un Huevo a la tabla Huevo, la relación del Pollo debe existir, y el pollo debe existir en la tabla, entonces no podías agregar un huevo a la mesa de huevos. Lo contrario también true. No puede agregar un Pollo a la tabla Pollo sin que la relación con el Huevo y el Huevo existan en la tabla Huevo. Por lo tanto, no se pueden hacer todos los registros en una base de datos sin romper una de las reglas/restricciones.

Base de datos nomenclatura de una relación uno a uno es engañosa. Todas las relaciones que he visto (por lo tanto, mi experiencia) serían más descriptivas como relaciones de uno a (cero o uno).

Esto se puede hacer mediante la creación de un extranjero primario simple key relación y establecimiento del extranjero key columna a única de la siguiente manera:

CREATE TABLE [Employee] (
    [ID]    INT PRIMARY KEY
,   [Name]  VARCHAR(50)
);

CREATE TABLE [Salary] (
    [EmployeeID]    INT UNIQUE NOT NULL
,   [SalaryAmount]  INT 
);

ALTER TABLE [Salary]
ADD CONSTRAINT FK_Salary_Employee FOREIGN KEY([EmployeeID]) 
    REFERENCES [Employee]([ID]);

Esquema

INSERT INTO [Employee] (
    [ID]
,   [Name]
)
VALUES
    (1, 'Ram')
,   (2, 'Rahim')
,   (3, 'Pankaj')
,   (4, 'Mohan');

INSERT INTO [Salary] (
    [EmployeeID]
,   [SalaryAmount]
)
VALUES
    (1, 2000)
,   (2, 3000)
,   (3, 2500)
,   (4, 3000);

Revisa para ver si todo está bien

SELECT * FROM [Employee];
SELECT * FROM [Salary];

Ahora, en general, en relación extranjera principal (uno a muchos), puede ingresar varias veces EmployeeIDpero aquí se arrojará un error

INSERT INTO [Salary] (
    [EmployeeID]
,   [SalaryAmount]
)
VALUES
    (1, 3000);

La declaración anterior mostrará un error como

Violación de la restricción CLAVE ÚNICA ‘UQ__Salary__7AD04FF0C044141D’. No se puede insertar duplicado key en el objeto ‘dbo.Salario’. el duplicado key el valor es (1).

Aquí puedes ver las comentarios y valoraciones de los usuarios

Finalizando este artículo puedes encontrar los informes de otros sys admins, tú además eres capaz insertar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *