2012-10-16 75 views

回答

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; 

对我的工作,让你的语法问题,可能在其他地方。

+0

感谢您的帮助,但是这又给出了另一个错误:#1064 - 您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,在第6行使用正确的语法,并指向选择的语句 – Mariam

+0

将'new'更改为'NEW'并添加'LIMIT 1'并查看是否修复了您的问题问题。 –

+0

谢谢。我做了,但它是相同的错误 – Mariam

1

我知道这是一个老问题,但我想我会分享我对我错误的看法,以防将来有人看到这种情况(如果我做了任何事情,随时可以进行社区编辑错误!)。

的原因有在原来的问题的问题似乎是与使用DELIMITER,而且它做什么,因为这里说明:What does DELIMITER // do in a Trigger?

在给定的代码:

 INSERT error_msg VALUES ('Foreign Key Constraint Violated!'); 
END IF; 
END; 
delimiter ; 

的复位带“分隔符”的分隔符表明它以前更改为其他分隔符,说:

DELIMITER // 
--TRIGGER1 
--TRIGGER2 
--TRIGGERn 
delimiter ; -- Aggravates me that this wasn't capitalised :P 

为分隔符设置为“//”(或其他)的原因,是为了让被分隔的多个语句,我什么思考,是原作者有这样的触发上述其他触发器,并改变了分隔符类似“//”,但忘了更改:

END IF; 
END; 
delimiter ; 

要:

END IF; 
END// 
delimiter ; 

因此,评论者之所以无法复制,是因为他们拥有正确的分隔符(“;”),并且由于只有一条语句要分隔,所以没有发现任何错误,正如作者所做的那样。 参见下面的测试代码和结果,包括初始化,因为一些证据:

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; 

以 “端;”,作为原始的代码:

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> 

其他,我不明白为什么这个例子没有用正确的外键约束来完成。作为我的第一个答案...希望这有助于任何人!也陷入了这一段时间。