2012-01-16 14 views
1

我正在制定课程时间表。有5班,每班每周发生一次。我有两张桌子,一张班表和一张时间表。触发器在类mysql时间表中复制同一表中的行

我试图做一个触发器,该行将在同一张表上复制,但在不同的日期输入。插入后我还需要删除该行。

我有这个至今:

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 ; 

我可以输入一个字符串在特定日期与程序后,将删除一条记录,或者可以只完成通过触发器

回答

2

由于限制的原因,不能通过触发器完成 - 在存储的函数或触发器中,不允许修改已被语句使用(用于读取或写入)的表调用函数或触发器。

编写存储过程来执行逻辑或在应用程序中执行它。


OK,假设我们有一个表,我们需要添加一条记录和复制的记录与不同的日期,存储过程可以帮助我们:

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子句来做到这一点。

+0

我对MySQL很陌生。你能解释,更深入的..谢谢:) – lovinxlost

+0

我添加了一个例子。 – Devart

+0

谢谢@Devart这真的很有帮助,谢谢你的解释。 我只是在设置subject_ID时遇到了一些麻烦。 我希望程序插入记录到日程表中,其中subject_id ='math01'..但是当我这样做'代码'时它的语法错误gibing INSERT INTO schtt VALUES WHERE subject_id ='BG0002'(DATE_ID + INTERVAL 1 DAY,subject_id,teacher,sched_TIME); 'code' 此外,如果我在程序中选择'从schtt'代码'code',我将能够读取当前表信息并复制到新记录中。 – lovinxlost

相关问题