Постоянные / статические переменные внутри триггера MySQL - PullRequest
1 голос
/ 04 мая 2011

У меня есть следующий триггер на таблице чёрных дыр, который перехватывает вставки и передает их другим таблицам.
Чтобы ускорить процесс, я хочу вычислить возрастающее значение и передать его в мои вставки.

DELIMITER $$

CREATE TRIGGER ai_blackhole_each AFTER INSERT ON `test.blackhole` FOR EACH ROW
BEGIN
  DECLARE calculated_id INTEGER;

  SET calculated_id = calc_id_for_previous_insert + 1;
  INSERT INTO example VALUES(new.field1, new.field2, calculated_id, ..);
END$$

DELIMITER ;

Могу ли я иметь статическую переменную внутри триггера, которая сохраняет свое значение между срабатываниями?
Или есть хитрость для эффективного достижения чего-то подобного?

1 Ответ

2 голосов
/ 04 мая 2011

Поместите прерывистое значение в таблицу MEMORY, начиная с 0

use test
DROP TABLE IF EXISTS test.blackholecounter;
DROP TABLE IF EXISTS test.blackhole;
DROP TABLE IF EXISTS test.example;
CREATE TABLE test.blackholecounter (calc_id INT NOT NULL DEFAULT 0) ENGINE=MEMORY;
INSERT INTO test.blackholecounter VALUES (0);
CREATE TABLE test.blackhole
(
    field1 VARCHAR(20),
    field2 VARCHAR(20)
) ENGINE=BLACKHOLE;
CREATE TABLE test.example (field1 VARCHAR(20),
field2 VARCHAR(20),
calc_id INT);
DELIMITER $$
CREATE TRIGGER ai_blackhole_each AFTER INSERT ON test.blackhole
FOR EACH ROW
BEGIN
    DECLARE calculated_id INTEGER;
    SELECT calc_id INTO calculated_id FROM test.blackholecounter;
    UPDATE test.blackholecounter SET calc_id=calc_id+1;
    INSERT INTO test.example VALUES(new.field1, new.field2, calculated_id);
END
$$
DELIMITER ;
SELECT * FROM test.blackholecounter;
SELECT * FROM test.example;
INSERT INTO test.blackhole (field1,field2) VALUES ('rolando','edwards'),('pamela','edwards');
SELECT * FROM test.blackholecounter;
SELECT * FROM test.example;

Вот что я получил, когда вставил это в MySQL

mysql> use test
Database changed
mysql> DROP TABLE IF EXISTS test.blackholecounter;
Query OK, 0 rows affected (0.00 sec)

mysql> DROP TABLE IF EXISTS test.blackhole;
Query OK, 0 rows affected (0.01 sec)

mysql> DROP TABLE IF EXISTS test.example;
Query OK, 0 rows affected (0.06 sec)

mysql> CREATE TABLE test.blackholecounter (calc_id INT NOT NULL DEFAULT 0) ENGINE=MEMORY;
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO test.blackholecounter VALUES (0);
Query OK, 1 row affected (0.00 sec)

mysql> CREATE TABLE test.blackhole(field1 VARCHAR(20),field2 VARCHAR(20)) ENGINE=BLACKHOLE;
Query OK, 0 rows affected (0.06 sec)

mysql> CREATE TABLE test.example (field1 VARCHAR(20),field2 VARCHAR(20),calc_id INT);
Query OK, 0 rows affected (0.09 sec)

mysql> DELIMITER $$
mysql> CREATE TRIGGER ai_blackhole_each AFTER INSERT ON test.blackhole
    -> FOR EACH ROW
    -> BEGIN
    ->     DECLARE calculated_id INTEGER;
    ->     SELECT calc_id INTO calculated_id FROM test.blackholecounter;
    ->     UPDATE test.blackholecounter SET calc_id=calc_id+1;
    ->     INSERT INTO test.example VALUES(new.field1, new.field2, calculated_id);
    -> END
    -> $$
Query OK, 0 rows affected (0.11 sec)

mysql> DELIMITER ;
mysql> SELECT * FROM test.blackholecounter;
+---------+
| calc_id |
+---------+
|       0 |
+---------+
1 row in set (0.00 sec)

mysql> SELECT * FROM test.example;
Empty set (0.02 sec)

mysql> INSERT INTO test.blackhole (field1,field2) VALUES ('rolando','edwards'),('pamela','edwards');
Query OK, 2 rows affected (0.07 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM test.blackholecounter;
+---------+
| calc_id |
+---------+
|       2 |
+---------+
1 row in set (0.00 sec)

mysql> SELECT * FROM test.example;
+---------+---------+---------+
| field1  | field2  | calc_id |
+---------+---------+---------+
| rolando | edwards |       0 |
| pamela  | edwards |       1 |
+---------+---------+---------+
2 rows in set (0.00 sec)

Вы можете начать начальное значение втаблицу test.blackholecounter другим номером или измените порядок, когда приращение происходит в триггере.

Дайте ему попытку !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...