同时在两个关系表中插入数据SQL Server

时间:2018-02-04 06:05:30

标签: sql sql-server

我有两个表,第一个是accounts,第二个是client。当客户注册时,我必须将他的电子邮件和密码插入accounts表,并将其他信息插入到client表中,并使用新创建的accounts表的外键。为什么我的查询没有运行?

INSERT INTO client (account_id, name, horoscope, credit, receive_email) 
VALUES 
    (INSERT INTO accounts(email, password, user_type) 
     OUTPUT inserted.id 
     VALUES ('test@example.com', 12, 0), 
   'name', 'Libra', 0.0, 0);

在这种情况下,如何使用单个查询在两个表中插入数据,我该怎么办?

2 个答案:

答案 0 :(得分:2)

您编写的SQL查询不正确,您需要将其分为两个语句,如下所示,假设 account_id 标识列。

INSERT INTO [accounts] 
            (email, 
             password, 
             user_type) 
VALUES      ( 'test@example.com', 
              12, 
              0 ) 

INSERT INTO client 
            (account_id, 
             NAME, 
             horoscope, 
             credit, 
             receive_email) 
VALUES      ( SCOPE_IDENTITY(), 
              'name', 
              'Libra', 
              0.0, 
              0 ) 

如果 account_Id 不是身份列,您可以将其写为以下内容(假设帐户表中的电子邮件ID是唯一的)。

INSERT INTO [accounts] 
            (email, 
             password, 
             user_type) 
VALUES      ( 'test@example.com', 
              12, 
              0 ) 

    INSERT INTO client 
                (account_id, 
                 NAME, 
                 horoscope, 
                 credit, 
                 receive_email) 
    SELECT TOP 1 account_id, 
                 'name', 
                 'Libra', 
                 0.0, 
                 0 
    FROM   [accounts] 
    WHERE  email = 'test@example.com' 

注意:您还需要处理事务,因为在这种情况下涉及两个插入。如果您不是从前端处理此问题,则需要在数据库级别处理此问题。要了解有关SQL Server中事务的更多信息,请访问MSDN

答案 1 :(得分:1)

我认为您可以使用scope_identity()来重新插入ID

DECLARE @ID INT 

INSERT INTO accounts 
( 
            email, 
            password, 
            user_type 
) 

SELECT @ID = scope_identity()

INSERT INTO client 
( 
    account_id, 
    name, 
    horoscope, 
    credit, 
    receive_email 
) 
VALUES 
(
    @ID,  
    'name', 
    'Libra', 
    0.0, 
    ''
);