【问题标题】:Updating a date as part of a trigger?更新日期作为触发器的一部分?
【发布时间】:2011-12-19 03:26:47
【问题描述】:

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

我注意到的第一件事是我在第 1 行的 " 处遇到语法错误,但在我创建表的地方没有双引号。我遇到的第二个问题是使用 @ 987654321@ 作为数据类型。我尝试使用CURRENT_TIMESTAMP 作为开始日期,但它返回了语法错误。我遇到的最后一个问题是触发器构造。我无法深入解决它。因为一旦我通过参考,我也会尝试解决这个问题。

CREATE TABLE plan(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(32),
  startdate TIMESTAMP NOT NULL,
  enddate TIMESTAMP);
CREATE TABLE level(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(32),
  description VARCHAR(500),
  startdate TIMESTAMP NOT NULL,
  enddate TIMESTAMP);
CREATE TABLE planIDxlevelID(
  planID INT NOT NULL REFERENCES plan(id),
  levelID INT NOT NULL REFERENCES level(id),
  arXORcur ENUM('archive', 'current');
);

delimiter |

CREATE TRIGGER testref BEFORE INSERT ON plan
  FOR EACH ROW BEGIN
    INSERT INTO plan(id, plan, startdate, enddate)
      SET id = LAST_INSERT_ID( id + 1), name = NEW.name, startdate = NEW.UTC_TIMESTAMP, enddate = NULL;
    UPDATE plan(enddate) WHERE plan.id = OLD.id
      SET enddate = UTC_TIMESTAMP;
    INSERT INTO planIDxlevelID(planID, levelID, arXORcur)
      SET planID = NEW.planID, levelID = OLD.levelID, arXORcur = current;
    UPDATE planIDxlevelID(planID, levelID, arXORcur)  WHERE planID = OLD.planID
      SET planID = OLD.planID, levelID = OLD.levelID, arXORcur = archive;
  END;
|

delimiter ;

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

【问题讨论】:

    标签: mysql triggers timestamp reference


    【解决方案1】:

    TIMESTAMPDATETIME

    这是一个经典的陷阱:TIMESTAMP 是一个 特殊 数据类型, 每次触摸该行时都会更新为“现在”,无论您将其更新为另一个值还是不理会它。你要的是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");
    

    【讨论】:

    • 我相信你,但我这里还是报错:CREATE TABLE planIDxlevelID( planID INT NOT NULL REFERENCES plan( id ) , levelID INT NOT NULL REFERENCES level( id ) , arXORcur ENUM( 'archive', 'current' ) ; 它说错误在 " 附近,但是没有双引号。奇怪吧?
    • 这不是双引号 ("),而是双撇号 ('')。您缺少右括号。它应该看起来像...arXORcur ENUM('archive', 'current' ) );(注意末尾的双括号)。我的错 - 我不知何故在那里得到了一个分号。您可以从我上面的(编辑的)帖子中复制更正的版本
    • 哦。甜的。是的,这不是我所追求的,但这是一个巨大的进步。它也比其他人带给我的要远得多。所以,非常感谢您的帮助,波西米亚人。
    • 我在insert 语句中收到#1442 错误,我想这可能是因为planIDxlevelID 表中的NOT NULL 与尝试添加@987654333 的触发器冲突@ 到 planID,但我将“NULL”更改为“unk”,表示“未知”。同样的错误。
    猜你喜欢
    • 1970-01-01
    • 2015-11-27
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2014-02-19
    • 2021-09-07
    • 1970-01-01
    相关资源
    最近更新 更多