【发布时间】:2021-04-03 18:39:42
【问题描述】:
我有两个独立的数据库表来存储公司员工的个人和地址信息,如下所示:
CREATE TABLE [dbo].[Person]
(
[BusinessEntityID] [int] IDENTITY(1,1) NOT NULL,
[NationalIDNumber] [int] NULL,
[FirstName] [nvarchar](50) NULL,
[LastName] [nvarchar](50) NULL,
CONSTRAINT [PK_Student]
PRIMARY KEY CLUSTERED ([BusinessEntityID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Address]
(
[AddressID] [int] NOT NULL,
[AddressLine1] [varchar](150) NULL,
[AddressLine2] [varchar](150) NULL,
CONSTRAINT [PK_StudentAddress]
PRIMARY KEY CLUSTERED ([AddressID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
当我在[dbo].[Person] 中插入一个新行(如[FirstName])时,它会自动创建一个[BusinessEntityID] 并一次递增一个。我想使用[BusinessEntityID] 值并将其插入[AddressID] 并为该员工的地址信息创建空间以便稍后输入。
可以使用触发器吗?我添加了这个触发器,但没有任何反应:
ALTER TRIGGER /*OR CREATE*/ [dbo].[auto_inc]
ON [dbo].[Person]
AFTER INSERT
AS
BEGIN
INSERT INTO Address(AddressID) SELECT p.BusinessEntityID FROM [Person] p
UPDATE [Address] SET AddressID = p.BusinessEntityID FROM [Person] p
END
【问题讨论】:
-
首先,它必须是
AFTER INSERT触发器,并且必须在dbo.Person表上.....其次:您没有引用@ 987654330@ 伪表,其中包含已插入的行 - 那么您希望如何获得新插入的BusinessEntityId值?第三:dbo.Address上的AddressIdalso 是IDENTITY列,因此您不应该只将自己的值插入其中 - 让 SQL Server 处理...... -
@marc_s 对不起,我是这些东西的新手。有一部分我不完全理解。我已经编辑了命令,将触发器移动到
Person表,从Address中删除了IDENTITY,但没有任何改变......我只是想移动相关行的 id.. 一定不难。
标签: sql sql-server database tsql triggers