2010-11-22 40 views
1

我相信這個問題已經出現,因爲我做了兩倍於我想象中的工作的激怒是必要的。數據庫正常化和懶惰的開發

我接受這樣一個想法,即我可能缺乏MySQL和PHP的經驗來思考一個更簡單的解決方案。

我的問題是,我有幾個表(我可能會添加更多),這些是父表,只包含兩個字段 - 一個id(int)和一個名稱標識它。

在這一刻,我有七個表,每個表中至少有15個字段。每個表都有一個字段,其中包含我可以鏈接到父表的id。

所有這些數據不需要填寫 - 您只需要在父表中創建一個條目即可。對於其他表格,我有單獨的表格。

現在,這些表單用於更新字段中的數據,這意味着如果有任何數據可用,我必須從表中提取數據。

我想要做的是當我從表單接收數據時,我可以在我的模型中使用UPDATE查詢。但是如果我想要更新的表沒有該特定ID的條目,我需要做一個插入。

所以,我現在的僞代碼是這樣的:

$sql = "SELECT id FROM table_x WHERE parent_id = ".$parent_id; 
$res = $mysql_query($sql); 
if(mysql_num_rows($res) == 1) 
{ 
    $sql = "UPDATE table_x SET ... WHERE parent_id = ".$parent_id; 
} 
else 
{ 
    $sql = "INSERT INTO table_x VALUES (...)"; 
} 
mysql_query($sql); 

我有兩個爲每個表我已經做到這一點 - 我可以做不同的事情或者更聰明,這只是它必須做的方式?因爲這對我來說似乎非常低效。

回答

4

使用

INSERT ... ON DUPLICATE KEY UPDATE Syntax 

,它會插入,如果沒有找到記錄
否則,將更新現有記錄,
,你可以插入之前跳過檢查 - details

這種假設關係對於父表中的每7張表是1:1

+0

這正是我所期待的。 – Repox 2010-11-23 13:11:33

0
mysql_query("UPDATE table table_x ..... WHERE parent_id=".$parent_id); 
if (mysql_affected_rows()==0) { 
    mysql_query("INSERT INTO ....."); 
} 
+0

請使用代碼格式(我糾正了這一點)。另外,我認爲「ON DUPLICATE KEY UPDATE」解決方案更美觀(我相信它更快)。 – oezi 2010-11-22 14:47:28

0

在MySQL中,你可以這樣做:

INSERT INTO table 
    (
    col1, 
    col2 
) VALUES(
    'val1', 
    'val2' 
) ON DUPLICATE KEY UPDATE table SET 
    col2 = 'val2' 

看一看的documentation瞭解更多信息

2

或者使用REPLACE而不是INSERT - 這是一個插入,但會做一個DELETE,然後插入時一個唯一的鍵(如主鍵)被違反。

+0

我喜歡這個主意,這就是爲什麼我給了你一個投票的答案 - 但是在DUPLICATE讓我感到我需要的感覺。 – Repox 2010-11-23 13:13:04