更新日期作为触发器的一部分?

时间:2011-12-19 03:26:47

标签: mysql triggers timestamp reference

我正在尝试在PHP Internet应用程序中保留当前内容和存档内容的列表。我希望能够识别归档为具有enddate的内容,以及未归档为没有enddate的内容。如果我可以创建更多路径,那将是理想的,但我希望从这里开始。

我注意到的第一件事是我在第1行遇到了语法错误,但是在我创建表时没有双引号。我遇到的第二个问题是使用{ {1}}作为数据类型。我尝试使用TIMESTAMP作为startdate,并且它返回了语法错误。我遇到的最后一个问题是触发器构造。我无法达到足够远的程度排除故障。一旦我通过参考文献,我也会尝试解决这个问题。

CURRENT_TIMESTAMP

1 个答案:

答案 0 :(得分:2)

TIMESTAMP vs DATETIME

这是一个经典的问题:TIMESTAMP特殊的数据类型 每次触摸行时都会使用“now”更新,无论是将其更新为其他值还是不管它。你想要的是DATETIME

接下来,您有许多语法和其他错误。以下执行没有错误,但它现在可能没有您想要的逻辑,但您可以编辑它来修复它:

CREATE TABLE plan (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(32),
  startdate DATETIME NOT NULL, -- changed TIMESTAMP to DATETIME
  enddate DATETIME -- changed TIMESTAMP to DATETIME
);

CREATE TABLE level (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(32),
  description VARCHAR(500),
  startdate DATETIME NOT NULL, -- changed TIMESTAMP to DATETIME
  enddate DATETIME -- changed TIMESTAMP to DATETIME
);

CREATE TABLE planIDxlevelID (
  planID INT NOT NULL REFERENCES plan(id),
  levelID INT NOT NULL REFERENCES level(id),
  arXORcur ENUM('archive', 'current')
);

DROP TRIGGER IF EXISTS test_insert;
delimiter |
CREATE TRIGGER test_insert BEFORE INSERT ON plan
  FOR EACH ROW BEGIN
    INSERT INTO plan (id, plan, startdate)
    values (LAST_INSERT_ID() + 1, NEW.name, NEW.UTC_TIMESTAMP());

    INSERT INTO planIDxlevelID (planID, levelID, arXORcur)
    values (NEW.ID, null, arXORcur = current);    
  END;|
delimiter ;

DROP TRIGGER IF EXISTS test_update;
delimiter |
CREATE TRIGGER test_update BEFORE UPDATE ON plan
  FOR EACH ROW BEGIN
    UPDATE plan SET
    enddate = UTC_TIMESTAMP
    WHERE plan.id = OLD.id;

    UPDATE planIDxlevelID SET
    planID = NEW.ID,
    levelID = null,
    arXORcur = archive
    WHERE planID = OLD.ID;
  END;|
delimiter ;

INSERT INTO plan (name) VALUES
  ("Frogs"), ("Toys"), ("Trucks"), ("Nature"), ("Seasons"),
  ("Construction"), ("Candy"), ("Rainbows"), ("Telephone"), ("Breakfasts");