2

このクエリの実行中にエラーが発生しました:

CREATE TRIGGER insert_Topics
  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 ;

エラーは言う:

1064 - SQL 構文にエラーがあります。8 行目の near '' を使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

そしてそれは THEN という単語を指しています

何か助けはありますか?前もって感謝します。

4

2 に答える 2

1

両方

CREATE TRIGGER insert_Topics
BEFORE INSERT
ON Topics
FOR EACH ROW
BEGIN
  IF NOT EXISTS(SELECT 1 FROM Subjects WHERE ID=NEW.SubjectID LIMIT 1) THEN
    INSERT INTO error_msg VALUES ('Foreign Key Constraint Violated!');
  END IF;
END;

CREATE TRIGGER insert_Topics
BEFORE INSERT
ON Topics
FOR EACH ROW
BEGIN
  IF (SELECT 1 FROM Subjects WHERE ID=NEW.SubjectID LIMIT 1) IS NULL THEN
    INSERT INTO error_msg VALUES ('Foreign Key Constraint Violated!');
  END IF;
END;

私のために働くので、構文の問題はおそらく他の場所にあります。

于 2012-10-16T03:35:38.753 に答える
1

これは古い質問であることは知っていますが、将来誰かがこれを見た場合に備えて、エラーが何であったと思うかについて私の考えを共有したいと思いました(私が間違いを犯した場合は、自由にコミュニティ編集してください!)。

ここで説明されているように、元の質問に問題があった理由は、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>

これ以外に、この特定の例が適切な外部キー制約で行われていない理由がわかりません。私の最初の答えとして...これが誰かに役立つことを願っています! これにもしばらく引っかかっていました。

于 2016-11-03T13:59:38.150 に答える