2

次の場合、テーブルの列を更新しようとしたときに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つずつ編集しようとすると、エラーなしで更新できます。私は今、ひどく混乱しているので、確認するだけだと思いました。

4

2 に答える 2

1

JobIDをjobs.JobIDと呼んで、それが使用されている場所で修飾を試みます。

しかし、私のdbaの本能は、実際の問題は別の場所にある可能性があることを示唆しています-このトリガーで発生している何かによって起動される別のトリガーがある可能性があります...おそらくジョブまたは請求書テーブルのトリガーですか?または、AFTER UPDATEこの同じテーブルにありますか?

で一般ログをオンにしてSET GLOBAL general_log = 1から、トリガーでエラーを引き起こすクエリを実行します。

次に、一般ログを再度オフにして(エラーを見つけやすくするため、ハードドライブをいっぱいにしないでください)、エラーが発生したときに実際に何が起こっていたかを正確に確認します...一般log、トリガーを最初に起動させた手動で実行したクエリに加えて、トリガーの内部から実行されるクエリを実際にログに記録する必要があります。

于 2012-12-31T23:44:49.243 に答える
0

あなたがするとき:

(select CustomerID FROM jobs WHERE JobID=old.JobID)

JobIDは、プレフィックスなしで、あなたが持っていると言うジョブテーブルの列です。old.JobIdはjobitems.JobIDになります。これは、oldが、これをトリガーする更新で使用されるテーブルを参照しているためです。

jobitemsから照合する列名が正確にjobIDであることを確認してください。

于 2012-12-31T20:12:27.140 に答える