我写了一个查询,但现在我有疑虑。
第一个我必须插入由特定供应商提供并由特定生产商生产的CD。
$sql="INSERT INTO cd (supplier_name,
supplier_address,
producer_name,
producer_address,
cd_title,
cd_type,
cd_year)
VALUES ('$_POST[supp_name]',
'$_POST[supp_addr]',
'$_POST[prod_name]',
'$_POST[prod_addr]',
'$_POST[cd_title]',
'$_POST[cd_year]' ,
'$_POST[cd_type]')";
但后来我意识到,我有一张名为CD的桌子,只有三个属性,标题,年份和类型。 CD(标题,年份,类型)。但是,我只需要由特定供应商X和特定生产商Y插入CD信息。我该怎么做?
另外,我的数据输入表格如下:
<form action="cd.php" method="post">
<h4> Enter CD information </h4>
CD Title: <input type="text" name="cd_title"><br>
CD Year: <input type="text" name="cd_year"><br>
CD Type: <input type="text" name="cd_type"><br>
<h4>Enter supplier information</h4>
Supplier Name: <input type="text" name="supp_name"><br>
Supplier Address:<input type="text" name="supp_addr"><br>
<h4> Enter producer information </h4>
Producer Name:<input type="text" name="prod_name"><br>
roducer Address:<input type="text" name="prod_addr"><br>
<input type="submit" name="submit" value="Submit">
所以,我想知道用户是否输入了上述数据,它存储在哪里?在什么表下? (也就是说,供应商和生产者信息存储在哪里?
答案 0 :(得分:1)
我不确定你的意思,但我会试一试:
尝试使用带有连接的选择到供应商和生产者表:
SELECT * FROM CD
JOIN Supplier S ON CD.Supplied = S.Supplied
JOIN Producer P ON CD.Produced = P.Produced
WHERE S.name = X AND P.name = Y
如果上面的查询返回true,则执行insert。
<强>更新强> 现在,在查看你的html格式时,我想我明白你在寻找什么......
你想要CD-table和Producer-table之间的关系以及CD-table和Supplier-table之间的关系。
您可以通过在CD表中添加和supplier_id-column以及在CD表中添加producer_id **列来实现此关系
AND
Supplier-table和Producer-table中的autoincremental id。
实际数据库的最后一步是在supplier-table的supplier_id和id-column以及producer-table的producer_id和id-column之间创建约束。
当你这样做时,你可能会这样做:
//When form is submitted...
//First query (Insert this only if it doesn't already exist in Supplier-table - IGNORE keyword takes care of this)
$sql1="INSERT IGNORE INTO Supplier (supplier_name,
supplier_address)
VALUES ('$_POST[supp_name]',
'$_POST[supp_addr]',
)";
//Execute query $sql1
//Get last inserted id from query $sql1 and store it in $idLastInsertedSupplier
//Second query (Insert this only if it doesn't already exist in Producer-table - IGNORE keyword takes care of this)
$sql2="INSERT IGNORE INTO Producer (producer_name,
producer_address)
VALUES ('$_POST[prod_name]',
'$_POST[prod_addr]')";
//Execute query $sql2
//Get last inserted id from query $sql2 and store it in $idLastInsertedProducer
//Insert CD-table query:
$sql="INSERT INTO CD (
cd_title,
cd_type,
cd_year,
supplier_id,
producer_id
)
VALUES ('$_POST[cd_title]',
'$_POST[cd_year]' ,
'$_POST[cd_type]',
$idLastInsertedSupplier,$idLastInsertedProducer)";
当然,您应该使用PDO或Mysqli的预备语句(带占位符)。我没有考虑SQL的安全性(不使用占位符,不清理数据等)。
为什么是id? 您可以在所有三个表中插入所有值而不在表之间使用引用(ids),但是没有关系数据库的意义。之后进行所有SQL操作也会困难得多。假设你想要一张与他们的生产商和供应商合作的所有CD的清单。
使用关系存储(使用其id),您可以执行如下的sql语句:
SELECT * FROM CD
JOIN Supplier S ON CD.id = S.id
JOIN Producer P ON CD.id = P.id
只需获取行。
没有这些参考,没有好办法做同样的事情。 (db不可能知道producer-table中哪一行属于CD表中哪一行而没有任何引用)。你当然可以在CD表中添加生产商和供应商的名称,但是那时会有重复,并且在大多数情况下你不需要它(在某些极端情况下,速度它将是唯一的选择虽然有这些重复)。
我希望我现在更清楚了。