次の場合、テーブルの列を更新しようとしたときにMySQLがエラーをスローする理由を追跡できないようです。
更新クエリは次のとおりです。
update jobitems set itemprice=itemprice/100;
エラーは次のとおりです。
Error Code: 1054. Unknown column 'JobID' in 'where clause'
ジョブアイテムのトリガーから以下を削除すると、更新が機能します。
DELIMITER $$
CREATE
DEFINER=`root`@`localhost`
TRIGGER `alacarte`.`jobitems_beforeupdate`
BEFORE UPDATE ON `alacarte`.`jobitems`
FOR EACH ROW
Begin
declare customer varchar(45);
Set @customer = (select CustomerID FROM jobs WHERE JobID=old.JobID);
If new.ItemCompleted<=>1
AND (select InvoiceStatus
FROM
(Select InvoiceStatus, CustomerID
FROM invoices
as custinvoices
Where CustomerID=@customer)
as InvoiceStatus
WHERE InvoiceStatus='Open') IS NULL
then
insert into invoices
set
CustomerID=@customer,
InvoiceBillToName=ifnull((select CustomerName FROM customers WHERE CustomerID=@customer),'-'),
InvoiceBillToAddress=etc;
当然、jobsテーブルにはJobID列とCustomerID列があります。他の多くのトリガーとフロントエンドはこれらの列を利用しており、問題なく機能します。
次のクエリは機能し、正しい「cust-000002」を返します。
Set @customer = (select CustomerID FROM jobs WHERE JobID='ALC-20121119-001');
select @customer;
また、次のクエリも機能します(このジョブアイテムのItemCompleted = 0であるため、上記のトリガーはトリガーされません)。
update jobitems set itemprice=itemprice/100 where JobID='ALC-20121119-001';
だから、私は公式に上記の情報に固執しています。助けてください :)。
アップデート:
変数を削除し、トリガー全体で「@customer」を(select CustomerID FROM jobs WHERE JobID = old.JobID)に置き換えると、予想どおりに同じエラーが発生します。
また、トリガーを変更することで、エラーがなくなります。私は変数を単に新しい方法で使用しました、そしてそれは機能します。以下は、@ customerの出力を各ジョブのテスト列に追加し、完全に機能します。えーと!
declare customer varchar(45);
Set @customer = (select CustomerID FROM jobs WHERE JobID=old.JobID);
If new.ItemCompleted<=>1
then
update jobs set testcol=@customer where JobID=old.JobID;
end if;
アップデート:
気が狂っていないことを確認するために、トリガーをコピーして貼り付けたところ、以前とまったく同じエラーメッセージが表示されるため、この問題は再現可能です。また、念のため、「ItemCompleted = 1」のエントリはエラーなしで更新できません。また、 「ItemCompleted = 0」のエントリは、フロントエンドを介してエントリを1つずつ編集しようとすると、エラーなしで更新できます。私は今、ひどく混乱しているので、確認するだけだと思いました。