создать общий идентификатор для нескольких таблиц - PullRequest
0 голосов
/ 27 марта 2019

У меня есть таблица электронной почты и таблица телефона, и я хочу создать общий идентификатор клиента для каждого вставляемого электронного адреса или номера телефона.

Например, если я вставляю электронные письма: a@a.a, b@b.b, c@c.c, d@d.d

и после этого я вставляю телефоны: 111-111, 222-222, 333-333

Я получу:

EMAIL | CustomerID
----------------
a@a.a | 1
b@b.b | 2
c@c.c | 3
d@d.d | 4

PHONE | CustomerID
----------------
111-111| 5
222-222| 6
333-333| 7

ии так далее, если я продолжаю вставлять для каждой таблицы

РЕДАКТИРОВАТЬ: я создаю таблицу Costumers и триггер для вставки электронной почты \ телефона, но она работает только для последней электронной почты \ телефона при каждой вставке:

CREATE TRIGGER [dbo].[tr_insertEmail]  ON  [dbo].[EmailTB]
instead of INSERT 
as
BEGIN
    declare @Email nvarchar(max);
    select @Email = Email from inserted
    INSERT INTO CostumersTB DEFAULT VALUES
    INSERT INTO [dbo].[EmailTB] (Email , CostumersID)
            values (@Email , IDENT_CURRENT('[dbo].[CostumersTB]'))  
END

1 Ответ

1 голос
/ 27 марта 2019

Для вставки нескольких строк вам нужно использовать цикл (INSERT-SELECT невозможен, так как в вашей таблице клиентов больше нет значений для объединения с новыми значениями), используйте OUTPUT вместо IDENT_CURRENTчтобы предотвратить проблемы, если несколько пользователей одновременно вставляют данные

CREATE TRIGGER [dbo].[tr_insertEmail]  ON  [dbo].[EmailTB]
INSTEAD OF INSERT 
as
BEGIN
    DECLARE @Email nvarchar(max);
    SELECT Email 
    INTO #Inserted    
    FROM Inserted
    DECLARE @id table(id int)
    WHILE EXISTS (SELECT 1 FROM #Inserted)
    BEGIN
        SELECT TOP 1 @Email = Email FROM #Inserted

        DELETE @ID

        INSERT INTO CostumersTB         
        OUTPUT Inserted.CustomersID INTO @id
        DEFAULT VALUES

        INSERT INTO [dbo].[EmailTB] (Email , CostumersID)
        SELECT @Email , ID FROM @id

        DELETE #Inserted WHERE Email = @Email
    END 
END

PS Не уверен, почему вы отказались от этой опции, если она была первой предложенной (см. комментарии к вопросу), ноЯ настоятельно рекомендую вам использовать SQL-последовательности

CREATE SEQUENCE dbo.CustomersSeq START WITH 1 INCREMENT BY 1;

И использовать вашу последовательность в качестве ограничения по умолчанию для ваших таблиц

ALTER TABLE [dbo].EmailTB ADD  CONSTRAINT [DF_Email_CustomerID]  
DEFAULT (NEXT VALUE FOR dbo.CustomersSeq) FOR CustomersID
GO

ALTER TABLE [dbo].PhoneTB ADD  CONSTRAINT [DF_Phone_CustomerID]  
DEFAULT (NEXT VALUE FOR dbo.CustomersSeq) FOR CustomersID
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...