Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用条件和左连接创建MYSQL触发器?_Php_Mysql_Database_Triggers - Fatal编程技术网

Php 如何使用条件和左连接创建MYSQL触发器?

Php 如何使用条件和左连接创建MYSQL触发器?,php,mysql,database,triggers,Php,Mysql,Database,Triggers,所以我有一个场景,我一直在乏味地寻找,但找不到两者都出现的情况 我有一个数据库,如果某个特定表被更新,它将执行一个触发器来查看该表artworkjobs\u production和第二个表artworkjobs中的值。我不同意在我加入之前创建数据结构的方式;然而,我想在不重构大量代码的情况下解决这个问题 我的想法是,一旦满足某些条件,我希望触发器启动并更新每个正在更新的特定行的日期 这是我创建的基本触发器,如果可能的话,我想知道将其设置为触发器的正确语法 CREATE TRIGGER creat

所以我有一个场景,我一直在乏味地寻找,但找不到两者都出现的情况

我有一个数据库,如果某个特定表被更新,它将执行一个触发器来查看该表artworkjobs\u production和第二个表artworkjobs中的值。我不同意在我加入之前创建数据结构的方式;然而,我想在不重构大量代码的情况下解决这个问题

我的想法是,一旦满足某些条件,我希望触发器启动并更新每个正在更新的特定行的日期

这是我创建的基本触发器,如果可能的话,我想知道将其设置为触发器的正确语法

CREATE TRIGGER createProductionScheduleDate
AFTER UPDATE ON artworkjobs_production
FOR EACH ROW
  IF (((OLD.artworkjobs.deleted = 0) OR (NEW.artworkjobs.deleted = 0))
      AND ((OLD.Status = 'Approved' OR OLD.scheduleForProd = 1) OR (NEW.Status = 'Approved' OR NEW.scheduleForProd = 1))
      AND ((OLD.prod.isCompleted IS NULL OR OLD.prod.isCompleted = 'N') OR
           (NEW.prod.isCompleted IS NULL OR NEW.prod.isCompleted = 'N'))
      AND ((OLD.printDueDate <> '0000-00-00 00:00:00') OR (NEW.printDueDate <> '0000-00-00 00:00:00'))
      AND (length(OLD.invoiceNumber) > 0) OR (length(NEW.invoiceNumber) > 0))
     AND ((OLD.importance > 0) OR (NEW.importance > 0))
     AND ((OLD.quantity > 0) OR (NEW.quantity > 0))) THEN
UPDATE artworkjobs_production
SET originalProdScheduleDate = now();
WHERE ON LEFT JOIN artworkjobs_production prod ON prod.jobid = id JOIN tblaccounts ON acc_id = CustomerID;
END$$
创建触发器createProductionScheduleDate
更新artworkjobs\u生产后
每行
如果(((OLD.artworkjobs.deleted=0)或(NEW.artworkjobs.deleted=0))
和((OLD.Status='Approved'或OLD.scheduleForProd=1)或(NEW.Status='Approved'或NEW.scheduleForProd=1))
和((OLD.prod.isCompleted为NULL或OLD.prod.isCompleted='N')或
(NEW.prod.isCompleted为NULL或NEW.prod.isCompleted='N'))
和((旧的.printDueDate'0000-00-00 00:00:00')或(新的.printDueDate'0000-00-00:00:00'))
和(长度(旧发票编号)>0)或(长度(新发票编号)>0))
和((旧的.importance>0)或(新的.importance>0))
和((OLD.quantity>0)或(NEW.quantity>0)),然后
更新artworkjobs\u生产
设置originalProdScheduleDate=now();
其中左侧的JOIN artworkjobs\u prod.jobid=id上的生产产品JOIN tblaccounts ON acc\u id=CustomerID;
结束$$
注意:我尝试了一下并更新了我的语法,但在接近结尾时出现了语法不正确的错误

以下是新代码:

CREATE TRIGGER createProductionScheduleDate
AFTER UPDATE ON artworkjobs_production
FOR EACH ROW
BEGIN
UPDATE artworkjobs_production
LEFT JOIN artworkjobs artworkjobs
ON jobid = artworkjobs.id
SET originalProdScheduleDate = now()
WHERE (((OLD.artworkjobs.deleted = 0) OR (NEW.artworkjobs.deleted = 0))
        AND ((OLD.artworkjobs.Status = 'Approved' OR OLD.artworkjobs.scheduleForProd=1 ) OR (NEW.artworkjobs.Status = 'Approved' OR NEW.artworkjobs.scheduleForProd=1 ))
        AND ((OLD.isCompleted is Null OR OLD.isCompleted = 'N') OR (NEW.isCompleted is Null OR NEW.isCompleted = 'N'))
        AND ((OLD.printDueDate <> '0000-00-00 00:00:00') OR (NEW.printDueDate <> '0000-00-00 00:00:00'))
        AND (length(OLD.invoiceNumber) > 0) OR (length(NEW.invoiceNumber) > 0)) 
        AND ((OLD.importance > 0) OR (NEW.importance > 0))
        AND ((OLD.quantity > 0) OR (NEW.quantity > 0)))
END;
创建触发器createProductionScheduleDate
更新artworkjobs\u生产后
每行
开始
更新artworkjobs\u生产
左连接artworkjobs artworkjobs
ON jobid=artworkjobs.id
设置originalProdScheduleDate=now()
其中(((OLD.artworkjobs.deleted=0)或(NEW.artworkjobs.deleted=0))
和((OLD.artworkjobs.Status='Approved'或OLD.artworkjobs.scheduleForProd=1)或(NEW.artworkjobs.Status='Approved'或NEW.artworkjobs.scheduleForProd=1))
和((OLD.isCompleted为Null或OLD.isCompleted='N')或(NEW.isCompleted为Null或NEW.isCompleted='N'))
和((旧的.printDueDate'0000-00-00 00:00:00')或(新的.printDueDate'0000-00-00:00:00'))
和(长度(旧发票编号)>0)或(长度(新发票编号)>0))
和((旧的.importance>0)或(新的.importance>0))
和((旧的.quantity>0)或(新的.quantity>0)))
结束;

mysql sql server。我假设您使用的是mysql的语法。代码将不同。Sean是MySQL中可接受的运算符。我想你不明白我的评论。我是说你已经用mysql和sql server标记了这个。它们不是一回事。我的评论与mysql中的有效运算符无关。这与正确标记你的问题有关。哦,我现在明白了,哈哈,很好的双关语,我没有意识到sql server被标记了。