2013-02-27 67 views
0

我發現很難找到一個好的標題,我希望我能更好地解釋它。 我有兩個表當候選鍵不存在時,用外鍵添加新行

"car" - id, car_id, name 
"car_pictures" - id, fk_car_id, url 

顯然,一個「車」能有幾張照片是那些通過在「car_pictures」表保存爲「fk_car_id」的car_id鏈接。 工作流程的前端可能是:

- you add a new car to the database 
- you add pictures to this car entry 

如果遵循這樣您第一次在「車」表中的新條目。然後,您可以在「car_pictures」表中引用「car_id」。

但是,如果你想改變工作流程是這樣的:

- you add a new car 
- you immediately add pictures 
- you save the new car to the database 

如果遵循這樣,您就創建數據庫條目僅當用戶已經完成了所有「臺階」。但是,如果您想將照片添加到汽車中,那麼它還沒有「car_id」。所以你不能引用id。

如果添加汽車和添加圖片是兩個獨立的api調用,例如通常的做法是什麼。

看來我需要澄清我在做什麼。 假設我有兩個API調用: www.domain.com/api/car/add/?name=newcar - >用於添加汽車(即添加到數據庫) www.domain.com/api/car/picture/add /?car_id = x - >用於將圖片添加到汽車(即處理上載並將數據存入數據庫)

前端看起來像這樣: 帶有全部表格的頁面您可以在其他頁面上編輯和添加新照片。另一個頁面添加一個新的車也有可能添加圖片。這與編輯汽車的頁面/形式相同,只是沒有car_id可用。

編輯:

我自己能想到的幾種方法來處理這種情況。

第一:當用戶打開「添加新車」表單時立即爲汽車創建數據庫條目。這樣你總是有一個car_id。但如果用戶決定取消添加汽車並需要刪除這些「虛擬」數據庫條目,則必須處理。如果出現問題,您可能會以數據庫中的大量空車入場結束。也許該行有一個標誌,當汽車實際上被用戶「插入」時該標誌被設置。

第二種:插入具有臨時否定fk_car_id的新圖片,並在數據庫中創建行時使用實際的car_id更新這些行。

第三:在沒有car_id的情況下,將新照片保存到帶有臨時ID的臨時表中。那麼您必須返回該臨時ID並在創建數據庫中的汽車入口時從臨時表中移動這些條目。

但這些想法聽起來很複雜,我希望有一些最佳實踐方式如何做到這一點。也許問題出在我的工作流程中,並且有更好的方法來做到這一點。然而,分開添加汽車和將圖片添加到數據庫的過程似乎是一個好主意。

+0

是否有可能爲你使用存儲過程和/或交易?用這種方法你可以做第一次插入,得到id,然後做第二次插入。如果出現問題,則不會寫入數據庫。 – GarethL 2013-02-27 17:11:35

+0

爲什麼你需要car_id在「car」表中? 「car」.id鏈接到fk_car_id – apoq 2013-02-27 17:13:12

+0

我無法使用事務,因爲添加圖片是一個單獨的腳本調用。 – DarsVaeda 2013-02-27 17:14:37

回答

0

一旦你添加了汽車,你想使用mysql_insert_id()來獲得在上次查詢中生成的ID。然後你可以提交圖片。

例如:

mysql_query("INSERT INTO car (name) VALUES ('car')"); 
$last_id = mysql_insert_id(); 
mysql_query("INSERT INTO car_pictures (fk_car_id, link) VALUES (".$last_id.",'link')"); 

我會用PDO代替mysql_不過建議你。

+0

如果在添加汽車和添加圖片之間添加新車,則不起作用。否則,你將不得不保存該ID並將其存儲在某個地方。這也不反映我喜歡應用的工作流程。 – DarsVaeda 2013-02-27 17:18:05

+0

這應該只用於初始上傳。我確信用戶可以回去添加更多的圖片,在這種情況下他們正在編輯汽車及其圖片。 – SeanWM 2013-02-27 17:20:02

+0

是的,但如果添加圖片和添加汽車是兩個腳本調用,這是我的場景,它不起作用。 – DarsVaeda 2013-03-01 08:01:08

0

您可以car_pictures.fk_car_id空的,那麼你可以不插入主記錄的圖片,並加入車的時候後面更新...

+0

下降的人可以解釋爲什麼嗎? FK列可以是空的,並且在那裏表示它沒有主記錄。我不認爲這是完美的方法,但它在某些情況下有效。 – a1ex07 2013-02-27 17:19:17

+0

第一:我沒有倒下它。 我還有一個問題。如果所有行都爲空,你怎麼知道哪些圖片屬於那輛車? – DarsVaeda 2013-03-01 07:59:09