Mysql 1109-字段列表中的未知表“ConcertDetails”

Mysql 1109-字段列表中的未知表“ConcertDetails”,mysql,triggers,Mysql,Triggers,我试图在CustomerOrders表中运行一个简单的Insert,结果出现错误:1109-字段列表中的未知表“ConcertDetails” 我对此做了一些搜索,并查看了大约7个不同的堆栈溢出帖子,但仍然不确定哪里出了问题。我还查找了有关触发器的信息,不同的站点上似乎有不同的语法。奇怪的是,这个触发器工作正常,不知道从4天前起有什么改变 我试着改变了一些东西,比如我取下了扳机,它让我插入,但是当我把扳机放回去时,我再也插不进去了,所以扳机一定出了问题。这就是我的触发器: DROP TRIGGE

我试图在CustomerOrders表中运行一个简单的Insert,结果出现错误:1109-字段列表中的未知表“ConcertDetails”

我对此做了一些搜索,并查看了大约7个不同的堆栈溢出帖子,但仍然不确定哪里出了问题。我还查找了有关触发器的信息,不同的站点上似乎有不同的语法。奇怪的是,这个触发器工作正常,不知道从4天前起有什么改变

我试着改变了一些东西,比如我取下了扳机,它让我插入,但是当我把扳机放回去时,我再也插不进去了,所以扳机一定出了问题。这就是我的触发器:

DROP TRIGGER IF EXISTS `alterPurchasePrice`;
DELIMITER //
CREATE TRIGGER `alterPurchasePrice` BEFORE INSERT ON `CustomerOrders`
 FOR EACH ROW BEGIN
    IF new.DiscountCode = 'yes' THEN
        SET new.PurchasePrice = ConcertDetails.Cost - 10;
    END IF;
END
//
DELIMITER ;
触发的目的是,如果用户在折扣代码字段中键入“是”,则将价格降低10美元

这涉及以下表格:

客户订单:ConcertID、CustomerName、折扣代码、订单ID、, 购买价格音乐会详情:音乐会日期、音乐会ID、成本
我认为您需要一个SELECT来从其他表检索值

要从ConcertDetails表中获取成本值,对于特定的concert,我们可以编写如下查询:

 SELECT ConcertDetails.cost  
   FROM ConcertDetails 
  WHERE ConcertDetails.concertid = ? 
SET NEW.purchaseprice
  = ( SELECT GREATEST(d.cost-10,0) AS discount_price
        FROM ConcertDetails d
       WHERE d.concertid = NEW.concertid
    );
假设concertid是ConcertDetails表的主键或唯一键,我们可以保证查询最多返回一行

要在触发器中使用它,我们应该能够执行类似的操作

SET NEW.PurchasePrice 
  = ( SELECT d.cost - 10 AS discount_price
        FROM ConcertDetails d
       WHERE d.concertid = NEW.concertid
    );
将通过引用NEW.concertid为查询提供要从CustomerOrders表插入的行的concertid列的值。该查询的返回值将分配给purchaseprice列

如果查询返回多行(如果我们不能保证ConcertDetails表中的concertid是唯一的),那么触发器将抛出过多行错误

如果没有返回任何行,我们希望为purchaseprice分配一个空值。如果cost列设置为NULL,我们还将返回NULL

是否有某种形式的保证,成本永远不会低于10?如果返回的成本是6,那么分配给purchaseprice的值将是-4。如果我们希望分配给purchaseprice的值永远不小于零,我们可以这样做:

 SELECT ConcertDetails.cost  
   FROM ConcertDetails 
  WHERE ConcertDetails.concertid = ? 
SET NEW.purchaseprice
  = ( SELECT GREATEST(d.cost-10,0) AS discount_price
        FROM ConcertDetails d
       WHERE d.concertid = NEW.concertid
    );
其他说明:

我建议对触发器使用不同的命名约定。对于多个表和多个触发器,在CustomerOrders表上查找触发器时,记住插入前触发器的名称是alterPurchasePrice可能会有点混乱。特别是如果你或其他人在六个月或六年后回到系统上工作

我们对触发器名称遵循的约定是使用表名,后跟下划线,后跟:bi、bu、bd、ai、au、ad中的一个,用于插入/更新/删除之前/之后。因为MySQL不允许每个触发器都有一个以上的触发器,所以我们不会遇到命名冲突。而且,在有人编写执行其他操作的插入前触发器之前,可以更容易地检查表上是否存在插入前触发器

我还提到,关于CamelCase表名的使用。。。MySQL参考手册中说:

为了避免问题。。。最好采用一致的约定,例如始终使用小写名称创建和引用数据库和表。建议使用此约定以实现最大的可移植性和易用性


再说一遍,这些只是惯例。我们还遵循一个惯例,通过命名一行所代表的内容来命名表。如果我们需要创建此表,我们将指定名称customer\u order。如果在设置NEW.PurchasePrice之前有任何内容,则表上的BEFORE INSERT触发器将命名为customer\u order\u bi

?我得到:1193-未知系统变量“PurchasePrice”。我在PhpMyAdminWe中的CustomerOrders表上运行了查询,我们应该能够删除该SET语句,而不是现有的SET语句。只需更换触发器中的那一行。这假设CustomerOrders表中有一个名为PurchasePrice的列。