MadMyche
Сначала о главном. Как заявил ОГ (Оригинал Грифф), AadharNumber к нему нужно было бы применить уникальный индекс. Если он будет храниться в Идентификационные Данные Сотрудника таблица, то вы можете запустить этот код:
CREATE UNIQUE NONCLUSTERED INDEX [IX_EmployeeIdentity_AadharNumber]
ON dbo.tbEmployeeIdentityDetails ( AadharNumber)
GO
Во-вторых, как спросил ОГ, почему они находятся в разных таблицах? Единственная реальная причина для разделения информации - это если размер строки превышает 8 КБ или если объем данных вызывает проблемы с производительностью. Отрицательными сторонами этой конструкции являются накладные расходы, связанные с наличием дополнительной таблицы, влияние на производительность ограничения внешнего ключа (которое по существу должно выполнять выбор в первой таблице), а также запросы, необходимые для получения всех данных. Еще одна вещь об ограничении FK - если вы не выполняете сложные звездообразные запросы, они практически не приносят никакой пользы, когда речь заходит о производительности.
Что касается таблицы сотрудников... если вы не собираетесь добавлять к нему Аадхар, ему потребуется больше уникальной информации. Некоторые имена довольно распространены, и столкновение вполне вероятно.
Теперь, для простого тестирования и обучения, мы оставим все как есть и предположим, что когда вы действительно создадите что-то реальное, вы будете следовать приведенным выше предложениям.
И мои предложения.
Я вообще не рекомендую использовать "прямой" доступ к таблицам (например, Insert, Select, Edit, Delete) и предпочитаю использовать хранимые процедуры. С двумя запросами вставки, которые у вас были, я заметил, что вы не всегда гарантируете, что второй набор идентификаторов, опубликованных, будет соответствовать первому. Если бы это было сделано с помощью программы, это исключило бы круговые поездки между приложением и базой данных с помощью этого, и вы даже могли бы вернуть новый идентификатор сотрудника следующим образом:
CREATE PROCEDURE dbo.EmployeeAndDetails_Create (
@Name NVARCHAR(32),
@Aadhar NVARCHAR(14)
) AS
BEGIN
SET NOCOUNT ON
DECLARE @EmpID INT = -1
INSERT tbEmployee (EmployeeName)
VALUES (@Name)
SET @EmpID = Scope_Identity()
INSERT tbEmployeeIdentityDetails (EmployeeId, AadharNumber)
VALUES (@EmpID, @Aadhar)
SELECT NewEmployeeID = @EmpID
END
GO
Webcodeexpert.com
спасибо за ваши комментарии. Я переработал таблицу, и она работает так, как требуется. Пожалуйста, посмотрите и дайте мне знать, правильно это или нет
идти
Создать таблицу tbEmployee (
EmployeeId INT IDENTITY(1,1) первичный ключ NOT NULL ,
Имя сотрудника VARCHAR(100)
);
ГО
Создать таблицу tbEmployeeIdentityDetails (
EmployeeId INT PRIMARY KEY FOREIGN KEY REFERENCES tbEmployee(EmployeeId),
AadharNumber VARCHAR(20) NOT NULL,
Ограничение UC_Employee_AadharNumber UNIQUE (AadharNumber)
);
ГО
Вставить в tbEmployee (EmployeeName)
ЦЕННОСТИ
("Аман"),
("Капил"),
("Виджай"),
("Панджак");
ГО
Вставить в tbEmployeeIdentityDetails (AadharNumber, EmployeeId)
ЦЕННОСТИ
('3157 8787 0987', 1),
('6432 3246 9097', 2),
('8875 8746 9234', 3)
ГО
Выберите * из списка tbEmployee
Выберите * из списка tbEmployeeIdentityDetails
если мы попытаемся вставить идентификационные данные для того же EmployeeId, который уже существует в таблице tbEmployeeIdentityDetails, он покажет ошибку "нарушение ограничения первичного ключа".
Вставить в tbEmployeeIdentityDetails (AadharNumber, EmployeeId)
ЦЕННОСТИ
('5543 4532 1123',2);
если мы попытаемся вставить идентификационные данные для идентификатора an EmployeeId который не существует в таблице tbEmployee это приведет к ошибке нарушения внешнего ключа
Вставить в tbEmployeeIdentityDetails (AadharNumber, EmployeeId)
ЦЕННОСТИ
('8157 8789 4987',9);
если мы попытаемся вставить существующий номер aadhar для EmployeeId, он покажет ошибку "нарушение ограничения уникального ключа"
Вставить в tbEmployeeIdentityDetails (AadharNumber, EmployeeId)
ЦЕННОСТИ
('3157 8787 0987',4);