2012-01-04 3 views
0

私は2つのテーブルpersoncustomerを持っています。 personから削除するとき、私はcustomerから削除する:ここで「FOR」というキーワードの近くに「不適切な構文があります」というメッセージが表示されるのはなぜですか?

CREATE TRIGGER DELCUS 
ON Person 
AFTER DELETE 
FOR EACH ROW 
begin 
DELETE FROM customer 
WHERE customer.PersonID_Fk=Person.PersonId; 
end 

は私が得るエラーです:

Msg 156, Level 15, State 1, Procedure DELCUS, Line 5 
Incorrect syntax near the keyword 'FOR'. 

は、なぜそれが行ごとに読むことができませんか?

+1

あなたはどのようなデータベースを使用していますか? – Atonewell

+0

sql server 2008 – Nickool

+0

SQL Serverには 'FOR EACH ROW 'はありません - トリガーは**文ごとに** **(そして** NOT ** **は行ごとに1回)呼び出され、**複数の行で呼び出される可能性があります*挿入、更新、または削除された行を保持する 'Inserted'および/または' Deleted'擬似テーブルに格納されます。トリガーは複数の行を同時に処理できる必要があります –

答えて

3

SQL Serverを使用している場合、あなたはこの希望:

CREATE TRIGGER DELCUS 
ON Person 
AFTER DELETE AS 
begin 
DELETE c 
FROM customer 
WHERE EXISTS (select 1 from deleted where customer.PersonID_Fk=deleted.PersonId); 
end 

MySQLを使用している場合、それはこのです:

CREATE TRIGGER DELCUS 
ON Person 
AFTER DELETE AS 
begin 
DELETE c 
FROM customer 
WHERE EXISTS (select 1 from old where customer.PersonID_Fk=old.PersonId); 
end 

しかし、実際に、あなたが実際にFKのセットを持っている場合とにかく参照の失敗のために人を削除しようとするとエラーになります。あなたの最善の策はFKをon delete cascadeに設定することです。

+0

メッセージ156、レベル15、状態1、プロシージャDELCUS、行4 キーワード 'begin'の近くに構文が正しくありません。 – Nickool

+0

@nikparsa - 'as'を忘れました:) – Eric

+0

lolありがとうございました。承認済み – Nickool

1

それとも、使用することができます。

DELETE FROM customer 
WHERE customer.PersonID_Fk in (select personid from deleted) 
+0

ありがとう、これもいいです – Nickool