2016-11-11 41 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? –

相关问题