триггер для дублирования строк в той же таблице в MySQL для расписания класса - PullRequest
1 голос
/ 16 января 2012

Я делаю расписание занятий. Есть 5 классов, каждый класс происходит один раз в неделю. У меня есть две таблицы: таблица классов и таблица расписаний.

Я пытаюсь создать триггер, в котором строка будет продублирована в той же таблице, но введена в другую дату. Мне также нужно, чтобы эта строка была удалена после вставки.

Пока у меня есть это:

DROP TRIGGER IF EXISTS `erase`// 
CREATE TRIGGER `erase` BEFORE DELETE ON `flsch`
FOR EACH ROW INSERT INTO flsch SELECT * FROM flsch WHERE DATE_ID=old.DATE_ID

Есть ли способ сделать это?

@ Devart Я добавил новый фрагмент кода, как указано ниже:

DELIMITER $$

 CREATE PROCEDURE add_f(IN param_DATEID TIMESTAMP, IN param_SNO VARCHAR(6), IN param_sub VARCHAR(20), IN param_SCHD INT(4))


BEGIN
IF SNO ='math01'
INSERT INTO schtt VALUES(param_DATEID, param_SNO, param_SUB, param_SCHD);
INSERT INTO schtt VALUES(param_DATEID + INTERVAL 7 DAY, param_SNO, param_SUB, param_SCHD);
END IF;

ELSE IF SNO='eng101'

INSERT INTO schtt VALUES(param_DATEID, param_SNO, param_SUB, param_SCHD);
INSERT INTO schtt VALUES((param_DATEID + INTERVAL 1 DAY) + INTERVAL 7 DAY, param_SNO, param_SUB, param_SCHD);
END IF;
END 

$$

DELIMITER ; 

Могу ли я ввести строку, которая удалит запись после определенной даты с помощью ПРОЦЕДУРЫ, или это можно сделать только с помощью триггера

1 Ответ

2 голосов
/ 16 января 2012

Это невозможно сделать с помощью триггера из-за ограничения - Внутри хранимой функции или триггера запрещено изменять таблицу, которая уже используется (для чтения или записи) оператором, который вызвал функция или триггер.

Напишите хранимую процедуру для выполнения логики или сделайте это в приложении.


Хорошо, предположим, что у нас есть таблица, и нам нужно добавить запись и дублированную запись с другой датой, хранимая процедура может помочь нам:

CREATE TABLE table1 (
  name VARCHAR(255) DEFAULT NULL,
  dt DATE DEFAULT NULL
);

DELIMITER $$

CREATE PROCEDURE add_two_records(IN param_name VARCHAR(255), IN param_dt DATE)
BEGIN
  INSERT INTO table1 VALUES(param_name, param_dt);
  INSERT INTO table1 VALUES(param_name, param_dt + INTERVAL 1 DAY);
END
$$

DELIMITER ;

Добавить записи:

CALL add_two_records('Rick', '2012-01-16');

Давайте проверим результат:

SELECT * FROM table1;
+------+------------+
| name | dt         |
+------+------------+
| Rick | 2012-01-16 |
| Rick | 2012-01-17 |
+------+------------+

Исправлены синтаксические ошибки:

DELIMITER $$

CREATE PROCEDURE add_f(IN param_DATEID TIMESTAMP, IN param_SNO VARCHAR(6), IN param_sub VARCHAR(20), IN param_SCHD INT(4))
BEGIN
IF param_SNO ='math01' THEN
  INSERT INTO schtt VALUES(param_DATEID, param_SNO, param_SUB, param_SCHD);
  INSERT INTO schtt VALUES(param_DATEID + INTERVAL 7 DAY, param_SNO, param_SUB, param_SCHD);
ELSE IF param_SNO='eng101' THEN
  INSERT INTO schtt VALUES(param_DATEID, param_SNO, param_SUB, param_SCHD);
  INSERT INTO schtt VALUES((param_DATEID + INTERVAL 1 DAY) + INTERVAL 7 DAY, param_SNO, param_SUB, param_SCHD);

  -- You can use this one -
  -- INSERT INTO schtt VALUES(param_DATEID + INTERVAL 8 DAY, param_SNO, param_SUB, param_SCHD);
END IF;

END$$

DELIMITER ; 

Вы спросили:

Могу ли я ввести строку, которая удалит запись после определенной даты с ПРОЦЕДУРОЙ ...

Да, вы можете сделать это с помощью оператора DELETE + предложения WHERE.

...