【问题标题】:Trigger to insert multiple record触发插入多条记录
【发布时间】:2019-10-21 18:54:38
【问题描述】:

我正在尝试创建一个触发器来插入我从“备份”表中的表中删除的所有值, 例如:

Table 1: NomePilota, ModelloVettura, NomeScuderia

BackupTable1 (Table 2): NomePilota, ModelloVettura, NomeScuderia

我希望触发器执行的操作:将表 1 中的已删除值插入到“表 2”中。

我试过这样:

CREATE TRIGGER Backup ON dbo.Table1 AFTER (i can only use after) DELETE AS
BEGIN

  DECLARE @Pilota VARCHAR(20) = (SELECT NomePilota FROM deleted)

  DECLARE @Vettura VARCHAR(50) = (SELECT ModelloVettura FROM deleted)

  DECLARE @Scuderia VARCHAR(20) = (SELECT NomeScuderia FROM deleted)

  INSERT INTO Table2 (NomePilota, ModelloVettura, NomeScuderia) VALUES (@Pilota, @Vettura, @Scuderia)

但它发送一个错误:

无法在@Pilota、@Vet、@Scud 中插入多条记录

我该如何解决这个问题?删除的表是否已经有一个默认的 ID 列可以在 for 中使用?我可以使用向量之类的东西吗? (like @Nome[] = SELECT * FROM Tabella, Insert into Tabella2 (Nome) VALUES @Nome[@Numero (numero 就像是nome的记录号])。

【问题讨论】:

  • 您使用的是哪个 RDBMS?您使用了两个与 mysql 相关的标签,还使用了 sql-server 标签。此外,您显示的 DECLARE 语法似乎是 Microsoft SQL Server 语法(MySQL 在触发器中的局部变量之前不使用 @ sigil)。那么它是什么?
  • 正如错误消息明确指出的那样,您的选择查询返回了多行...
  • 通过@var 声明、dbo. 限定符和对deleted 的引用,我们可以很确定这是 Transact-SQL (MIcrosoft SQL Server) 而不是 MySQL
  • 查看docs,在开始之前,您需要很好地了解 SQL Server 触发器的工作原理。由于InsertedDeleted 可以有多行,因此您必须在触发器中处理此问题。理想情况下使用适当的基于集合的逻辑,否则逐行操作。

标签: sql-server sql-delete database-trigger


【解决方案1】:

为什么不让生活变得简单?

INSERT INTO Table2 (NomePilota, ModelloVettura, NomeScuderia) 
   SELECT NomePilota, ModelloVettura, NomeScuderia FROM deleted

insert 语句可以处理 select 的结果——在这里我们利用它来简化手头的任务。

【讨论】:

  • 这比 OP 试图做的要好一百万倍。为什么?因为这是基于设置的,并且不遵循 OP 发布的反模式,其中代码假定只有一行被删除。
  • (我希望OP能弄清楚这意味着三个DECLARE语句应该被删除,)
  • 我正在使用 DECLARE,因为我使用的软件不支持 INSERT SELECT 所以我首先需要将值放入变量中,然后插入它们,所以算上这个,怎么能我这样做?
  • 那个lorenzo是什么软件?
  • @LorenzoMontini 我向您保证 SSMS 2017 支持这种类型的插入语句。是什么让你决定你的版本没有?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多