我试图在CustomerOrders表中运行一个简单的Insert并得到错误:#1109 - Unknown table' ConcertDetails'在字段列表中
我对此进行了一些搜索并查看了大约7个不同的堆栈溢出帖子,但仍然不确定是什么问题。我还查找了有关触发器的信息,并且在不同的站点上似乎有不同的语法。奇怪的是这个触发器工作得很好,不确定自4天前以来发生了什么变化。
我尝试改变一些东西,例如我移除了触发器并让它插入,但是当我把触发器放回去时我不能再插入,所以触发器一定有问题。这就是我对触发器的看法:
this
触发器的目的是在用户输入'是'时将价格降低10美元。进入DiscountCode字段。
这涉及表格:
答案 0 :(得分:0)
我认为你需要一个SELECT来从其他表中检索值。
获得" cost"的价值来自" ConcertDetails" table,对于特定的音乐会,我们可以写一个这样的查询:
SELECT ConcertDetails.cost
FROM ConcertDetails
WHERE ConcertDetails.concertid = ?
假设" concertid"是ConcertDetails表的主键(或唯一键),我们将保证查询最多返回一行。
要在触发器中使用它,我们应该可以做这样的事情
SET NEW.PurchasePrice
= ( SELECT d.cost - 10 AS discount_price
FROM ConcertDetails d
WHERE d.concertid = NEW.concertid
);
将通过对concertid
的引用为查询提供要从CustomerOrders表插入的行的NEW.concertid
列的值。该查询的返回将分配给purchaseprice列。
如果查询返回多行(如果我们没有任何保证" Conceid"在" ConcertDetails"表中是唯一的,则可能会发生这种情况) ,触发器会抛出太多行"错误。
如果没有返回任何行,我们期望分配的NULL值将被分配给" purchaseprice"。如果"成本"我们也会返回NULL。 column设置为NULL。
是否有某种保证"成本"永远不会少于10?如果返回的Cost为6,则分配给" purchaseprice"将是-4。如果我们想要分配给" purchaseprice"永远不会少于零,我们可以这样做:
SET NEW.purchaseprice
= ( SELECT GREATEST(d.cost-10,0) AS discount_price
FROM ConcertDetails d
WHERE d.concertid = NEW.concertid
);
其他说明:
我建议您为触发器使用不同的命名约定。使用多个表和多个触发器时,在CustomerOrders表上查找触发器时,要记住BEFORE INSERT触发器的名称是" alterPurchasePrice",这会让人感到困惑。特别是如果您(或其他人)从现在起六个月或六年后重返系统。
我们遵循的触发器名称约定是使用表的名称,后跟下划线,后跟以下之一:bi,bu,bd,ai,au,ad(用于之前/之后插入/更新/删除)。 (由于MySQL不允许为每个触发器提供多个触发器,因此我们不会发现命名冲突。并且在某人写BEFORE之前,它可以更容易检查表上是否存在BEFORE INSERT触发器执行其他操作的INSERT触发器。)
我还提到,关于CamelCase表名的使用...... MySQL参考手册说:
为避免出现问题...最好采用一致的约定,例如始终使用小写名称创建和引用数据库和表。建议使用此约定以实现最大的便携性和易用性。
https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html
然后,这些只是惯例。我们还遵循一个约定,通过命名单个行代表什么来命名表。如果我们需要创建此表,我们将分配名称customer_order
。并且表上的BEFORE INSERT触发器将命名为customer_order_bi