2017-04-24 10 views
0

BEFORE INSERTトリガーにIF EXIST句を作成して、重複レコードが挿入されないようにする方法はありますか?


 
-- Create a trigger to prevent a student from registering for a section that the student is already 
 
-- registered for. 
 
USE College ; 
 

 
DROP TRIGGER IF EXISTS Registration_Before_Insert; 
 

 
DELIMITER $$ 
 

 
      
 
     CREATE TRIGGER Registration_Before_Insert 
 
     BEFORE INSERT ON Registration 
 
     FOR EACH ROW 
 
     
 
     
 
     
 
     BEGIN 
 
     
 
     DECLARE Studentid INT; 
 
     
 
     SELECT COUNT(*) INTO Studentid FROM Registration WHERE StudentID= NEW.StudentID; 
 
     IF NEW.Studentid= 100 AND NEW.SectionID= 16 THEN 
 
\t \t \t \t SIGNAL SQLSTATE VALUE '45000' 
 
\t \t \t \t SET MESSAGE_TEXT= 'The student is already registered for this section'; 
 
\t \t END IF ; 
 

 
     END $$ 
 

 
DELIMITER ; 
 

 
INSERT INTO Registration(StudentID, SectionID, Grade) 
 
VALUES(100, 16, 4.2); 
 

 
INSERT INTO Registration(StudentID, SectionID, Grade) 
 
VALUES(100, 16, 4.2);

私は、学生が既に登録されているセクションの登録から学生を防ぐために、BEFORE UPDATEトリガーを作成するに取り組んでいますが、私はIFの内EXISTS句を使用するかどうかはわからない私同じレコードを2回挿入すると、そのトリガを起動するトリガ。誰でも助けてくれますか?ここに私のコードはありますか?

+0

何か他に定義された変数studentidを変更する必要があります。しかし、あなたの要件がトリガーなので、私はこれを答えとして掲示しません。 –

+0

@ Tim Biegeleisenなぜ、2番目のINSERTが先に進み、エラーメッセージを表示せずに同じレコードを再度挿入するのかのヒントを教えてください。 – User445555

答えて

0

はおそらく、あなたはちょうど私があなたにも(StudentID、セクションID) ``にユニーク制約を置くことによって、これを達成できると思い

DROP TABLE IF EXISTS REGISTRATION; 
CREATE TABLE REGISTRATION(StudentID INT, SectionID INT, Grade DECIMAL(10,2)); 


DROP TRIGGER IF EXISTS Registration_Before_Insert; 
DELIMITER $$ 
     CREATE TRIGGER Registration_Before_Insert 
     BEFORE INSERT ON Registration 
     FOR EACH ROW 
     BEGIN 
     DECLARE counter INT; 
     SELECT COUNT(*) INTO counter FROM Registration WHERE StudentID= NEW.StudentID 
       and new.sectionid = sectionid; 
     IF counter > 0 THEN 
       SIGNAL SQLSTATE VALUE '45000' 
        SET MESSAGE_TEXT= 'The student is already registered for this section'; 
     END IF ; 
     END $$ 

DELIMITER ; 

TRUNCATE TABLE REGISTRATION; 

INSERT INTO Registration(StudentID, SectionID, Grade) 
VALUES(100, 16, 4.2); 

INSERT INTO Registration(StudentID, SectionID, Grade) 
VALUES(100, 16, 4.2); 
+0

@ PSalmon、なぜTRUNCATE文を書くのですか?なぜあなたはそれを置くのか分かりません。 Truncate文は、実際のテーブルではなく、テーブル内のデータを削除しますか?あなたの声明は機能します。ご協力いただきありがとうございます。 – User445555

+0

あなたは切り捨てる必要はありません - 私はテストの際にテーブルが空であることを保証するために慣れていません。 –

関連する問題