PDO使用外键插入表中

时间:2012-12-18 16:26:00

标签: php mysql pdo insert-update

我在使用mysql和PDO时遇到了一些困难。

我希望将产品插入数据库,但产品表包含外键。当然,插入时我不会知道外键ID。我这样做对吗???有没有更好的方法来解决这个问题?

表产品

  • Id PK AI int
  • 名称Varchar(20)
  • CategoryId Int FK
  • TypeId Int FK

表类别

  • Id Int PK
  • Cat varchar(20)

表类型

  • Id Int PK
  • 输入varchar(20)

    $type = 'Gloves';
    $category = 'Clothing';
    $sql = 'INSERT INTO Products
        SET Name = :name, CategoryId = :catId, TypeId = :typeId
        WHERE 
            CategoryId IN (SELECT Id FROM Categories WHERE Cat = :category) AND
            TypeId IN (SELECT Id FROM Types WHERE Type = :type)'
    
    $stmt = $db->prepare($sql); 
    $stmt->execute(array(':name' => 'Pink childrens gloves', ':category' => $category, ':type' => $type));
    

如下面的评论所述:通常情况下,我会从选择框中获取ID。我不能这样做,因为它将是执行查询的脚本,而不是用户。

4 个答案:

答案 0 :(得分:1)

你确定这是你想要的吗?

$sql = 'INSERT INTO Products
    SET Name = :name
    WHERE 
        CategoryId IN (SELECT Id FROM Categories WHERE Cat = :category) AND
        TypeId IN (SELECT Id FROM Types WHERE Type = :type)'

我认为您正在尝试使用UPDATE

$sql = 'UPDATE Products
    SET Name = :name
    WHERE 
        CategoryId IN (SELECT Id FROM Categories WHERE Cat = :category) AND
        TypeId IN (SELECT Id FROM Types WHERE Type = :type)'

答案 1 :(得分:1)

MySQL允许在单个查询中组合SELECT + INSERT

INSERT INTO tbl_temp2 (fld_id)
  SELECT tbl_temp1.fld_order_id
  FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;

......但我不关心它。如果在一个查询中执行三个不同的操作,则无法进行正确的错误检查。

我的建议是,您首先验证是否存在与给定名称匹配的类别和类型。在该步骤中,您可以轻松获取相应的ID,这将允许您执行简单的INSERT。此外,如果您需要插入许多产品,您可以先验证一次。

答案 2 :(得分:0)

除了@ÁlvaroG。Vicario的答案之外,你还可以做类似的事情(在普通的sql中工作,我没有用绑定变量试过它):

$sql = 'INSERT INTO Products
        SET Name = :name,
            CategoryId = (SELECT Id FROM Categories WHERE Cat = :category),
            TypeId = (SELECT Id FROM Types WHERE Type = :type)';

但我会先检查现有的类别和类型,在必要时插入并获取所需的ID,因为如果内部选择中没有匹配项,这将导致意外的结果。

答案 3 :(得分:0)

首先,您需要弄清楚哪个是具有外键数据的表。

然后你需要从外键表中获取所有可能的值。

最后,您需要构建和下拉列表或类似内容,以提供选择可接受的外键的能力。

$q=$db->prepare('SELECT ke.referenced_table_name assoc_table,
ke.referenced_column_name assoc_col FROM
information_schema.KEY_COLUMN_USAGE ke WHERE ke.referenced_table_name IS NOT NULL             
AND ke.table_schema=:database AND ke.table_name=:tablename AND ke.column_name=:col');
$q->bindValue(':database','mydatabasename'); //Set your database name here
$q->bindValue(':tablename','Departments');   //Set your table name here
$q->bindValue(':col','City');                //Set the column which foreign key values you want to have here
if($q->execute()) {
 $foreingtable=$q->fetch(PDO::FETCH_ASSOC);
 $q=$db->prepare('SELECT '.$foreingtable['assoc_col'].' FROM '.$foreingtable['assoc_table']);
  if($q->execute())
   echo json_encode($q->fetchAll(PDO::FETCH_COLUMN));
 }
else {
   header('http/1.1 500 Internal Server Error');
   print_r($q->errorInfo());
   exit;
 }

有关此内容的更多信息:Get list of possible foreign key values in MySql using PDO