为几个表创建通用ID

时间:2019-03-27 13:11:05

标签: sql-server

我有一个电子邮件表和一个电话表,我想为我插入的每个电子邮件或电话号码创建共同的客户ID。

就像我插入电子邮件一样:a@a.ab@b.bc@c.cd@d.d

然后插入电话:111-111222-222333-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 个答案:

答案 0 :(得分:1)

对于多行插入,您需要使用循环(无法进行INSERT-SELECT,因为您的客户表上没有更多的值可以与新值连接),请使用OUTPUT而不是{ {1}}可以防止多个用户同时插入数据时出现问题

IDENT_CURRENT

PS 如果该选项是第一个提供的选项,则不确定为什么要放弃此选项(请参阅问题的注释),但我强烈建议您使用SQL序列

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

并将您的序列用作表的默认约束

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