我在使用mysql和PDO时遇到了一些困难。
我希望将产品插入数据库,但产品表包含外键。当然,插入时我不会知道外键ID。我这样做对吗???有没有更好的方法来解决这个问题?
表产品
表类别
表类型
输入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。我不能这样做,因为它将是执行查询的脚本,而不是用户。
答案 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