2016-11-11 56 views
0

我知道存在與聽起來相同的答案的問題,但我已經檢查過它們,並且我無法回答我的問題。如何在添加記錄之前檢查其他表中是否存在外鍵

我有一個食譜表,裏面有「chef_id」和「category_id」列。 然後,我有一個廚師表,帶有「id」和「name」列,以及類別表,還有「id」和「name」列。

當我插入一個新配方,我必須添加chef_id和category_id,它們需要已經存在,否則,它應該告訴我添加食譜前添加廚師和新類別。

如何以及在哪裏檢查?我正在使用SQL PDO。這是我到目前爲止有:

的functions.php

function add_recipe($name =':name', 
        $categories_id=':categories_id', 
        $chef_id=':chef_id') { 

     include 'db_connection.php'; 
    try { 
     $sql = "INSERT INTO recipes(name, categories_id, chef_id) " 
      . "VALUES (:name, :categories_id, :chef_id)"; 


     if(chef_id and category_id exist) { 
      then execute the query; 
     } 

     $results = $conn->prepare($sql); 
     $results->bindParam(':name', $name, PDO::PARAM_STR, 100); 
     $results->bindParam(':categories_id', $categories_id, PDO::PARAM_INT); 
     $results->bindParam(':chef_id', $chef_id, PDO::PARAM_INT); 

    if($results->execute()) { 
     echo '1 row has been inserted'; 
    } 

    $conn = null; 

    } catch(PDOException $e) { 
     echo 'Error: ' . $e->getMessage() . '<br />'; 
     return false; 
    } 
    return true; 

} 

我能想到的是正確的唯一的一點是SQL CHECK約束....但我希望不是這樣因爲我發現安靜很難理解它是如何工作的...

謝謝!

+1

只要做到從table_name的其中id =一個'選擇素數(ID):在其他表id',看是否你會得到任何結果,然後再進行插入。 –

+0

但是,如果在這一點上他們的對應行可能不存在,你如何使用'chef'和'category' ids? –

回答

1

您在MySql中創建一個存儲過程,以避免多次往返檢查數據庫。

我將使用僞代碼,因爲在電話現在:

CREATE FUNCTION create_receipt(p_name, p_chef, p_category) 
    { 
    int i_chef_id 
    int i_category_id 

    -- try to get chef_id if exist 
    SELECT INTO i_chef_id 
       chef_id 
    FROM chefs 
    WHERE chef = p_chef 

    if i_chef_id IS NULL { 
     -- create new chef and get new created id 
     INSERT chef values (p_chef) 

     SELECT INTO i_chef_id 
        chef_id 
     FROM chefs 
     WHERE chef = p_chef   
    } 

    if not exist category { 
     INSERT category values(category) 
    } 

    INSERT receipt (name, i_chef_id, i_category_id) 
    } 
+0

哈哈......它很有道理!我會試試看,謝謝! –

+0

爲'不存在'你需要做一個選擇,看看你是否得到了一些東西。但是因爲所有發生在服務器端的應該是快速的。 –

+0

uix,我很抱歉。你的意思是,如果我在廚師桌上存在chef_id,我需要在廚師桌上做一個SELECT? –

相關問題