2015-04-19 30 views
1

我有2個表格:dbvotes.votesdbsystem.topics 現在我想確定是否有人爲某個主題投票。查詢「檢查」主題是否存在。我有以下內容(感謝SO上的一些主題)。failafe mysql查詢插入與其他表中的驗證值

此代碼有效,但它是正確的方式嗎?

INSERT INTO dbvotes.votes (topicid,vote,voterid) VALUES(
(SELECT topicid 
FROM dbsystem.topics 
WHERE topicid = 20), 
(12), 
(1) 
) 

它採用的是選擇一個不同的database.table是我的故障安全(因爲它返回NULL /了MySqlError當topicid不存在)的一部分。使用的值是用戶提交的。

這是嵌套sql語句嵌入子句的「值」部分的正確方法嗎?

回答

2

不是試圖通過代碼確保數據完整性,而是應該定義外鍵約束來爲您完成這項工作。在你的情況下,dbvotes.votes將引用dbsystem.topics,這意味着,當沒有相應的主題時,您不能插入投票。順便說一下,名稱表明,它們位於不同的數據庫中。你有特別的理由嗎?這有點「不尋常」,我不會推薦它。

無論如何,你的表的定義會是這個樣子:

CREATE TABLE votes(
id int auto_increment, 
topicid int, 
vote tinyint, 
voterid int, 
PRIMARY KEY (id), 
FOREIGN KEY (fk_topicid_topics) REFERENCES topics(id) 
) ENGINE=InnoDB; 

您還可以添加選項,如

... 
FOREIGN KEY (fk_topicid_topics) REFERENCES topics(id) ON DELETE CASCADE 
) ENGINE=InnoDB; 

這意味着,當相應的主題將被刪除的選票被刪除。

爲此,您必須使用支持外鍵的引擎,意思是而不是 MyISAM,但最有可能是InnoDB。
而且你必須在被引用的列上有一個索引。

最後insert語句是這樣的:

INSERT INTO votes(topicid,vote,voterid) 
VALUES (20, 12, 1); 
+0

哇,這是高超的!非常感謝你。當用戶被刪除或需要魔法時,我還可以進行級聯嗎?我確實使用2個數據庫。原因是我試圖創建某種投票功能,而不必混淆原始系統的數據庫。所以用戶只能從系統數據庫中選擇值。外鍵是否仍然有效? – rinserepeat

+0

我這麼認爲,是的。而對於「用戶刪除」的事情,只需爲用戶表創建另一個外鍵即可。此外,只是一個提示,您也可以授予對單個表的只讀訪問權限,即使對於列也是如此。無需將它保存在兩個數據庫中,但它應該無論如何都能正常工作。 – fancyPants

+0

非常感謝大家,這似乎是最好的解決方案!乾杯! – rinserepeat

2

您可以使用此:

INSERT INTO dbvotes.votes (topicid,vote,voterid) 
SELECT (20, 12, 1) 
FROM dbsystem.topics 
WHERE topicid = 20; 

如果topictopicid等於20存在於表dbsystem.topics,將出現INSERT值(20, 12, 1)。否則,將不會有INSERT。

+0

感謝您的回答,那看起來更乾淨 – rinserepeat