【问题标题】:Error: Not allowed to return a result set from a trigger错误:不允许从触发器返回结果集
【发布时间】:2017-11-12 08:23:15
【问题描述】:
DROP TRIGGER IF EXISTS `examcnpm`.`users_BEFORE_DELETE`;

DELIMITER $$
USE `examcnpm`$$
CREATE DEFINER = CURRENT_USER TRIGGER `examcnpm`.`users_BEFORE_DELETE` BEFORE DELETE ON `users` FOR EACH ROW
BEGIN
    declare id int;

    select id= (select userid from deleted);
    delete from Result where Result.userid=id;

    delete u from Users as u inner join deleted as r on u.userid=r.userid 
    where u.userid=id;
END$$

DELIMITER ;

【问题讨论】:

  • 我希望看到对 OLD 的引用。删除触发器中的值。
  • 我不明白??
  • 您的第一个问题是导致错误的 select id= (select userid from deleted)。如果您不理解我对 OLD 的引用。那么您需要专门查看触发器的文档“在触发器主体中,OLD 和 NEW 关键字使您能够访问受触发器影响的行中的列。 OLD 和 NEW 是 MySQL 对触发器的扩展;它们不区分大小写' (dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html)。
  • 谢谢,但这是触发 SQL Server,所以如何从语法 SQL 转移到语法 mysql
  • 在 mysql 中,您无法操作导致触发器触发的表。删除用户试图做什么?

标签: mysql triggers


【解决方案1】:

我不清楚您为什么要从触发器中的用户中删除,或者为什么使用之前而不是之后查询。但这里是如何使用 OLD。从结果中删除。

DROP TRIGGER IF EXISTS `users_BEFORE_DELETE`;
DELIMITER $$
CREATE DEFINER = CURRENT_USER TRIGGER `users_BEFORE_DELETE` after DELETE ON `u` FOR EACH ROW
BEGIN
        delete from Result where Result.id=old.id;
END$$
DELIMITER ;

例如

ariaDB [sandbox]> select id,username from u order by id limit 5;
+----+----------+
| id | username |
+----+----------+
|  2 | Jane     |
|  3 | Ali      |
|  6 | Bruce    |
|  7 | Martha   |
|  8 | Sidney   |
+----+----------+
5 rows in set (0.00 sec)

MariaDB [sandbox]> select * from result order by id limit 10;
+----+
| id |
+----+
|  2 |
|  2 |
|  3 |
|  3 |
|  6 |
|  6 |
|  7 |
|  7 |
|  8 |
|  8 |
+----+
10 rows in set (0.00 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> delete from u where id = 2;
Query OK, 1 row affected (0.04 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> select id,username from u order by id limit 5;
+----+----------+
| id | username |
+----+----------+
|  3 | Ali      |
|  6 | Bruce    |
|  7 | Martha   |
|  8 | Sidney   |
| 10 | charlie  |
+----+----------+
5 rows in set (0.00 sec)

MariaDB [sandbox]> select * from result order by id limit 10;
+----+
| id |
+----+
|  3 |
|  3 |
|  6 |
|  6 |
|  7 |
|  7 |
|  8 |
|  8 |
| 10 |
| 10 |
+----+
10 rows in set (0.00 sec)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2012-10-22
    • 2013-04-17
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    相关资源
    最近更新 更多