【问题标题】:How do i go about inserting primary key value into another table primary key?如何将主键值插入另一个表主键?
【发布时间】:2014-04-19 17:04:56
【问题描述】:

我有 sproc 将执行插入 2 个表,第一个表主键将插入地址表(将与其他 5 个表共享)作为地址 id,当我尝试提取联系信息时将参考特定的司机,学生..等。 正如人们可能会说的 Scope_Identity,如果我只有 2 个表,这很好,但是当我尝试插入表学生或驱动程序的地址 scope_Scope_Identity 时,我可能会遇到重复或主键违规。 任何想法如何去做才能将驱动程序,学生..等主键插入地址表 建议该键将从窗口形式的文本框中插入,或者任何人都可以建议如何去做此操作以及如何改进存储过程

下面是我的存储过程,因为没有设置标识列,所以会失败

USE [GlobalReachCare]
GO
/****** Object:  StoredProcedure [dbo].[main_Escort_Insert]    Script Date: 19/04/2014 09:07:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================

ALTER PROCEDURE [dbo].[main_Escort_Insert]

-- Add the parameters for the stored procedure here
@EscortID int,
@FirstName varchar(50),
@Surname varchar(50),
@CrbCheck bit = 0,
@CrbRef varchar(25) = false,
@ExpiryDate date = null,
@Training bit = false,
@TrainingType bit = false,
--@AddressID int,
@Address1 varchar(20),
@Address2 varchar(20)= null,
@Address3 varchar(20) = null,
@City varchar(16),
@PostCode varchar(16),
@Email varchar(50) = null,
@Telephone nvarchar(20),
@DateOfBirth date= null,
@NationalIN nvarchar(25)
AS
BEGIN
DECLARE @Escort int
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

-- Insert statements for procedure here
Insert Into dbo.tb_EscortsDetails( EscortId,FirstName,Surname, [CRB_Check], [CRB_Ref],ExpiryDate, Training, TrainingType)
                   VALUES(@EscortId,@FirstName,@Surname,@CrbCheck,@CrbRef,@ExpiryDate,@Training,@TrainingType)

                   set @Escort = SCOPE_IDENTITY()


                   insert into tb_Addresses(AddressID,Address1,address2,Address3,City,PostCode,Email,Telephone,DateOfBirth
                   ,NationalINO)
                   Values(@Escort,@Address1,@Address2,@Address3,@City,@PostCode,@Email,@Telephone,@DateOfBirth,@NationalIN)
END

【问题讨论】:

  • tb_Addresses 中是否使用了主键?
  • 真的很难理解你在问什么,你能在表格和预期结果中显示示例数据吗?

标签: sql-server tsql stored-procedures


【解决方案1】:

你自己给出了答案:

because no identity column is not set

很遗憾,您无法在创建表后添加身份。尝试放下你的桌子,然后重新创建它们。您可以按照以下方式进行操作

DROP TABLE tb_EscortsDetails
GO
CREATE TABLE tb_EscortsDetails (
    EscortID INT NOT NULL IDENTITY PRIMARY KEY,
    FirstName NVARCHAR(50) NOT NULL,
    Surname NVARCHAR(50) NOT NULL,
    CRB_Check BIT NOT NULL,
    CRB_Ref NVARCHAR(25) NOT NULL,
    ExpiryDate DATE NOT NULL,
    Training bit NOT NULL,
    TrainingType bit NOT NULL
)

GO
DROP TABLE tb_Addresses 
GO
CREATE TABLE tb_Addresses (
    AddressID INT NOT NULL IDENTITY PRIMARY KEY,
    EscortID INT NOT NULL,
    Address1 NVARCHAR(20) NOT NULL,
    address2 NVARCHAR(20) NOT NULL,
    Address3 NVARCHAR(20) NOT NULL,
    City NVARCHAR(16) NOT NULL,
    PostCode NVARCHAR(16) NOT NULL,
    Email NVARCHAR(50) NOT NULL,
    Telephone NVARCHAR(20) NOT NULL,
    DateOfBirth DATE NOT NULL,
    NationalINO  NVARCHAR(25) NOT NULL,

    FOREIGN KEY (EscortID) REFERENCES tb_EscortsDetails (EscortId)
)

然后你就可以执行你的程序了

USE [GlobalReachCare]
GO
/****** Object:  StoredProcedure [dbo].[main_Escort_Insert]    Script Date: 19/04/2014 09:07:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================

ALTER PROCEDURE [dbo].[main_Escort_Insert]
    -- Add the parameters for the stored procedure here
    --@EscortID int,
    @FirstName varchar(50),
    @Surname varchar(50),
    @CrbCheck bit = 0,
    @CrbRef varchar(25) = false,
    @ExpiryDate date = null,
    @Training bit = false,
    @TrainingType bit = false,
    --@AddressID int,
    @Address1 varchar(20),
    @Address2 varchar(20)= null,
    @Address3 varchar(20) = null,
    @City varchar(16),
    @PostCode varchar(16),
    @Email varchar(50) = null,
    @Telephone nvarchar(20),
    @DateOfBirth date= null,
    @NationalIN nvarchar(25)
AS
BEGIN
    DECLARE @Escort int
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    Insert Into dbo.tb_EscortsDetails(FirstName,Surname, [CRB_Check], [CRB_Ref],ExpiryDate, Training, TrainingType)
    VALUES(@FirstName,@Surname,@CrbCheck,@CrbRef,@ExpiryDate,@Training,@TrainingType)

    set @Escort = SCOPE_IDENTITY()

    insert into tb_Addresses(EscortID,Address1,address2,Address3,City,PostCode,Email,Telephone,DateOfBirth,NationalINO)
    Values(@EscortID,@Address1,@Address2,@Address3,@City,@PostCode,@Email,@Telephone,@DateOfBirth,@NationalIN)
END

确保将 CREATE TABLE 列替换为您要使用的数据类型

希望这会有所帮助!

【讨论】:

  • Victor,你为我节省了很多时间,因为我完全忘记了外键,因为我最近才开始使用 T-SQL。这正是我想要的谢谢你的努力和时间
  • 没问题!如果您愿意,请不要忘记将我的评论标记为答案:)
  • 嗨,维克多,上面只适用于护送表,但如果我还有另外 4 个表,我需要在每个表的地址表中都有一个外键,我会结束一行有空外键作为护送,司机或学生将单独插入。我的意思是护送详细信息将与学生分开插入,与司机详细信息分开。我在想的是一个列,它的值可以从类似于上面的 sproc 的其他 4 个 sproc 插入。
猜你喜欢
  • 2023-03-17
  • 2021-10-25
  • 1970-01-01
  • 2018-07-01
  • 2021-08-05
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多