これは古い質問であることは知っていますが、将来誰かがこれを見た場合に備えて、エラーが何であったと思うかについて私の考えを共有したいと思いました(私が間違いを犯した場合は、自由にコミュニティ編集してください!)。
ここで説明されているように、元の質問に問題があった理由は、DELIMITER の使用とその機能にあるようです: What does DELIMITER // do in a Trigger?
指定されたコードでは:
INSERT error_msg VALUES ('Foreign Key Constraint Violated!');
END IF;
END;
delimiter ;
「delimiter ;」による区切りのリセット 以前に別の区切り文字に変更されたことを示します。たとえば、次のようにします。
DELIMITER //
--TRIGGER1
--TRIGGER2
--TRIGGERn
delimiter ; -- Aggravates me that this wasn't capitalised :P
区切り文字を「//」(またはその他)に設定する理由は、複数のステートメントを区切ることができるようにするためであり、私が考えているのは、元の作成者がそのトリガーの上に他のトリガーを持っていて、区切り文字を「//」のようなものに変更しましたが、変更するのを忘れていました:
END IF;
END;
delimiter ;
に:
END IF;
END//
delimiter ;
したがって、コメンターが複製できなかった理由は、正しい区切り文字セット (";") があり、区切り文字が 1 つしかなかったため、作成者のようにエラーが見つからなかったからです。いくつかの証拠として、初期化を含む次のテスト コードと結果を参照してください。
DELIMITER ; -- Just in case
DROP TABLE IF EXISTS Topics, Subjects, error_msg;
CREATE TABLE Subjects ( id INT(5) PRIMARY KEY,
subjectname CHAR(20));
CREATE TABLE Topics ( topicname CHAR(20),
subjectID INT(5)
# FOREIGN KEY (subjectID) REFERENCES Subjects(id) - How this check should be done...
);
CREATE TABLE error_msg ( Message VARCHAR(50) );
INSERT INTO Subjects VALUES
('5', 'Arts'),
('55', 'Maths'),
('2342', 'Biology'),
('12345', 'Finance');
DELIMITER $$ -- Where the delimiter would be defined, originally
CREATE TRIGGER InsertOnTopics
BEFORE INSERT ON Topics
FOR EACH ROW
BEGIN
IF (SELECT COUNT(*) FROM Subjects WHERE id=NEW.subjectID)=0 THEN
INSERT error_msg VALUES ('Foreign Key Constraint Violated!');
END IF;
END$$
DELIMITER ;
INSERT INTO Topics VALUES
('Welfare Benefits', '5'),
('Eigenvectors', '55'),
('Mitochondria', '2342'),
('Bank of Dad', '12345'),
('Something else', '555');
SELECT * FROM error_msg;
元のコードとして「end;」を使用すると、次のようになります。
mysql> SOURCE /Users/benpalmer/test.sql
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
Query OK, 0 rows affected (0.02 sec)
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('Something else', '555')' at line 6
Empty set (0.00 sec)
mysql>
私のコードで「END$$」を使用すると:
mysql> SOURCE /Users/myUsername/test.sql
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
Query OK, 0 rows affected (0.02 sec)
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
+----------------------------------+
| Message |
+----------------------------------+
| Foreign Key Constraint Violated! |
+----------------------------------+
1 row in set (0.00 sec)
mysql>
これ以外に、この特定の例が適切な外部キー制約で行われていない理由がわかりません。私の最初の答えとして...これが誰かに役立つことを願っています! これにもしばらく引っかかっていました。