当我需要知道另一个表中的外键值时,如何将数据插入表中?

时间:2012-07-17 18:53:27

标签: mysql database database-design

我有两张桌子:

Customer,字段ID是自动增量,主键是

address,字段customer_ID是外键。

我有一个表格,要求提供所有客户信息及其地址(可以超过1个)

我运行以下两个查询来更新数据库,但是我正在手动输入Customer_ID的值来测试它。

mysql_query("INSERT INTO customer(First_Name, Surname, Company_Name, Telephone, Alt_Telephone)VALUES('$fName', '$lName', '$cName', '$tel', '$altTel')") ;
mysql_query("INSERT INTO address(line_1, line2, town, postcode, customer_ID)VALUES('$line1', '$line2', '$town', '$post_code', '2')") ;

customer_ID字段应与customer表中的当前ID字段相同如何确保在填写地址表时自动执行此操作?

2 个答案:

答案 0 :(得分:2)

使用PHP

解决问题的最简单方法是在第一次调用mysql_query(在表客户中插入数据)后,在php代码中调用mysql_insert_id。< / p>

此函数将返回插入的最后一个ID,但您必须确保 customer 的ID是自动递增的主键。

mysql_insert_id返回的值对于给定的连接/会话是本地的,即使另一个连接在您输入了ID后插入记录也是如此。


使用MySQL

您可以使用SQL函数LAST_INSERT_ID(),如下所示,只需确保先前的sql-query运行是插入 customer (以及检查以便id确实是一个键,并且自动递增)。

-- first insert into `customer`

INSERT INTO address
  address(line_1, line2, town, postcode, customer_ID)
VALUES
  ('$line1', '$line2', '$town', '$post_code', LAST_INSERT_ID());

php-version 相同,LAST_INSERT_ID()将检索您最后插入的ID。


您还可以使用可以描述为 SELECT INTO 的SQL功能,请参阅以下代码段:

INSERT INTO address
 address(line_1, line2, town, postcode, customer_ID)
SELECT
  '$line1', '$line2', '$town', '$post_code', customer.id
FROM customer
WHERE <some_constraint>

答案 1 :(得分:1)

你可以(1)在php中使用mysql_insert_id(),或者在你的sql中直接使用(2)LAST_INSERT_ID()

代码示例1:

mysql_query("INSERT INTO customer(First_Name, Surname, Company_Name, Telephone, Alt_Telephone)
    VALUES('$fName', '$lName', '$cName', '$tel', '$altTel')") ;
$customer_id = mysql_insert_id();
mysql_query("INSERT INTO address(line_1, line2, town, postcode, customer_ID) 
    VALUES('$line1', '$line2', '$town', '$post_code', {$customer_id})") ;

代码示例2:

mysql_query("INSERT INTO customer(First_Name, Surname, Company_Name, Telephone, Alt_Telephone)
    VALUES('$fName', '$lName', '$cName', '$tel', '$altTel')") ;
mysql_query("INSERT INTO address(line_1, line2, town, postcode, customer_ID) 
    VALUES('$line1', '$line2', '$town', '$post_code', LAST_INSERT_ID())") ;