MySQL一对一的关系

时间:2015-11-12 14:58:55

标签: php mysql database

在浏览stackoverflow之后,我仍然在理解mysql中的一对多关系时遇到一些麻烦。我有来自用户的请求(表单提交),该请求将存储在一个表中。这是一个动态表单,允许用户添加额外的字段,因此这些字段将存储在单独的表中。简而言之,在我的数据库设计中,将有一个用于PRIMARY KEY AUTO INCREMENT的用户的表,并且将有另一个表用于主机名PER用户(多个字段-array)并使用引用主要的外键用户表中的键。对不起,如果这很长,但试图使这个问题成为一个好问题。

示例:

User Table: (ONE) 

1. John Doe, blah, 11-12-15
2. Sally Po, blah, 11-14-15
3. John Doe, blah, 11-15-15

(这是三个单独的请求)
(数字是主键auto auto。)

Host Name Table: (MANY)
1. www.johndoe.com
1. www.johndoe2.com
1. www.johndoe3.com
2. www.sallypo.com
2. www.sallypo2.com

(这些数字(外键)应与每个请求的主键匹配)

代码(离开实际的查询+非常确定我不会使用last_id):

$sql = "CREATE TABLE IF NOT EXISTS userTable (
id int AUTO_INCREMENT, 
firstName VARCHAR(30) NOT NULL,
date DATE NOT NULL,
PRIMARY KEY (id)
)";

//query

$sql = "CREATE TABLE IF NOT EXISTS hostNamesTable (
id int NOT NULL,
hostName VARCHAR(90) NOT NULL,
FOREIGN KEY (id) REFERENCES userTable(id)
)";
//query

$sql = "INSERT INTO userTable (firstName, date) 
VALUES ('$firstName', '$date')";
//query

$last_id = mysqli_insert_id();

for($i = 0; $i < sizeof($hostName); $i++){
    $sql = "INSERT INTO hostNamesTable (id, hostName)
    VALUES ('$last_id', '$hostName[$i]')";
    //query
}

我做错了什么? (这是正确的方法吗?)
注意:我试图获取用户表的last_id,以便我可以在hostName表中将其用作外键

编辑:我正在使用带有php的MySQLi

编辑2:
在更改之后,这是我现在得到的错误:无法添加或更新子行:外键约束失败(d9832482827984hb28397429hostNamesTable,CONSTRAINT hostNamesTable_ibfk_1 FOREIGN KEY({{ 1}})REFERENCES iduserTable))错误:INSERT INTO hostNamesTable(id,hostName,)VALUES(&#39;&#39;,&#39; secondhost.net&#39; )

- 看起来$ last_id甚至没有被记录?

编辑3:开始工作。不确定它是什么,但我认为这是因为某种类型。

2 个答案:

答案 0 :(得分:0)

为什么不在hostNames表中添加一个名为“ref_user”的额外列,并包含您要提供给的用户的ID?因此,您可以在两个表中使用唯一ID。

进行如下查询:

SELECT * FROM hostNames WHERE ref_user = (SELECT id FROM userTable WHERE <uniqueColumn> = <uniqueIdentifierOfUser>);

但是包含的请求必须只返回用户的一行。

答案 1 :(得分:0)

尝试在mysqli_insert_id

中添加mysqli $ link作为参数
$last_id = mysqli_insert_id($link);

我认为你的代码中有这个

$link = mysqli_connect("localhost", "mysql_user", "mysql_password", "mysql_db");

如果这不起作用,请尝试使用mysql LAST_INSERT_ID()函数

$last_id = $mysqli->query("SELECT LAST_INSERT_ID() AS last_id")->fetch_object()->last_id;