Обновление даты как часть триггера? - PullRequest
1 голос
/ 19 декабря 2011

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

Первое, на что я обращаю внимание, это то, что я получаю синтаксическую ошибку в "в строке 1,но нет двойной кавычки, где я создаю таблицу. Вторая проблема, которую я имею, - это использование TIMESTAMP в качестве типа данных. Я попытался использовать 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";

1 Ответ

2 голосов
/ 19 декабря 2011

TIMESTAMP против DATETIME

Это классическая ошибка: 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...