通过多个外键插入多个表

时间:2020-10-02 18:39:28

标签: php mysql foreign-keys

我有多个通过几个不同的外键连接在一起的表(请参见附加图像)。 TABLES

我正在尝试插入项目表中。我一直在尝试通过下面的以下代码来完成此操作,但是它不起作用。现在,我收到一条错误消息,说client_id_fk和project_manager_id_fk都没有值。这是有道理的,因为我没有在插入中包括它们,但是它们不是自动递增的,我也不能只向这些字段添加随机int,因为这也会引发错误。如果我将client_id_fk和project_manager_id_fk设置为NULL,从技术上讲它是可行的,但是其他表中没有数据...请帮助


$sql1 = "INSERT INTO PROJECTS (Project_Name, StartDate) VALUES( '".$_POST["Project_Name"]."','".$_POST["StartDate"]."')";
$sql2 = "INSERT INTO CLIENTS(Client_Name, Client_Email, Client_Phone) VALUES ('".$_POST["Client_Name"]."','".$_POST["Client_Email"]."','".$_POST["Client_Phone"]."')";
$sql3 = "INSERT INTO PROJECT_MANAGERS(ProjectManager_Name,Project_Manager_Email, Project_Manager_Phone) VALUES ('".$_POST["ProjectManager_Name"]."','email', 'phone')";     
$sql4 = "INSERT INTO TYPE_OF_WORK(TypeOfWork) VALUES ('".$_POST["TypeOfWork"]."')";

3 个答案:

答案 0 :(得分:0)

退后一步,考虑一下您正在建模的关系。您已经告诉MySQL,一个项目有一个客户端和一个项目经理。这就说得通了。然后,您尝试仅插入具有以下信息的项目:

INSERT INTO PROJECTS (Project_Name, Start_Date) ...

您遇到的错误是询问您“此项目针对哪个客户端,谁是项目经理?”那只是你所知道的。

  • 如果是新客户,则需要在项目之前插入 ;如果是新的项目经理,则也需要在项目之前插入它。插入它们后,您需要获取它们的ID,例如与the LAST_INSERT_ID() function
  • 如果它是现有的客户和/或项目经理,则需要根据应用程序中有意义的逻辑来查找其ID。

一旦有了这两个ID,就可以创建Project:

INSERT INTO PROJECTS (Project_Name, Start_Date, Client_Id, Project_Manager_Id) ...

答案 1 :(得分:0)

这是错误的:

$sql1 = "INSERT INTO PROJECTS (Project_Name, StartDate) VALUES( '".$_POST["Project_Name"]."','".$_POST["StartDate"]."')";
$sql2 = "INSERT INTO CLIENTS(Client_Name, Client_Email, Client_Phone) VALUES ('".$_POST["Client_Name"]."','".$_POST["Client_Email"]."','".$_POST["Client_Phone"]."')";
$sql3 = "INSERT INTO PROJECT_MANAGERS(ProjectManager_Name,Project_Manager_Email, Project_Manager_Phone) VALUES ('".$_POST["ProjectManager_Name"]."','email', 'phone')";     
$sql4 = "INSERT INTO TYPE_OF_WORK(TypeOfWork) VALUES ('".$_POST["TypeOfWork"]."')";

因为您尝试将INSERTprojectsclient.id插入数据库中不存在的project_manager.id。因此,上面的代码实际上应该这样写(以防您使用mysqli):

$link = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');

/* check connection */
if (!$link) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

// First add the client in case the table is completely empty
$stmt = mysqli_prepare($link, "INSERT INTO clients(name, email, phone) VALUES (?,?,?);");
mysqli_stmt_bind_param($stmt, 'sss', $_POST["Client_Name"], $_POST["Client_Email"], $_POST["Client_Phone"]);
/* execute prepared statement */
mysqli_stmt_execute($stmt);
/* close statement and connection */
mysqli_stmt_close($stmt);

// Then add the project_manager in case the table is completely empty
$stmt = mysqli_prepare($link, "INSERT INTO project_managers(name, email, phone) VALUES (?,?,?);");
mysqli_stmt_bind_param($stmt, 'sss', $_POST["ProjectManager_Name"], 'email', 'phone');
/* execute prepared statement */
mysqli_stmt_execute($stmt);
/* close statement and connection */
mysqli_stmt_close($stmt);

// Also add the type_of_work in case the table is completely empty
$stmt = mysqli_prepare($link, "INSERT INTO type_of_work(TypeOfWork) VALUES (?);");
mysqli_stmt_bind_param($stmt, 's', $_POST["TypeOfWork"]);
/* execute prepared statement */
mysqli_stmt_execute($stmt);
/* close statement and connection */
mysqli_stmt_close($stmt);

// Finally add your project
$stmt = mysqli_prepare($link, "INSERT INTO projects (project_name, start_date, client_id, project_manager_id) SELECT ?,?,client.id,project_managers.id FROM client,project_managers WHERE client.name = ? AND client.email = ? AND client.phone = ? AND project_managers.name = ?;");
mysqli_stmt_bind_param($stmt, 'ssssss', $_POST["Project_Name"],$_POST["StartDate"],$_POST["Client_Name"], $_POST["Client_Email"], $_POST["Client_Phone"],$_POST["ProjectManager_Name"]);
/* execute prepared statement */
mysqli_stmt_execute($stmt);
/* close statement and connection */
mysqli_stmt_close($stmt);

/* close connection */
mysqli_close($link);

答案 2 :(得分:-1)

模式:

private Map<String, Integer> locationCache = new HashMap<>();

public int getUniform(String name) {
    if (locationCache.containsKey(name))
        return locationCache.get(name);
    int result = glGetUniformLocation(ID, name);
    if (result == 1) System.err.println("Could not find uniform variable '" + name + "'!");
    else locationCache.put(name, result);
    return result;
}

public void setUniform1f(String name, float value) {
    if (!enabled) start();
    glUniform1f(getUniform(name), value);
}

如果最后一个INSERT中的某个子查询有可能返回多于1行,则将该子查询中的输出列包装到 -- Insert data into slave tables INSERT INTO slave_1 (columns_1) VALUES ('values_1'); INSERT INTO slave_2 (columns_2) VALUES ('values_2'); -- Insert data into main table, -- query FK values from slaves -- using values inserted above -- as filtering conditions INSERT INTO main (columns_main, fk_column_1, fk_column_2) SELECT 'values_main', slave_1.id, slave_2.id FROM ( SELECT id FROM slave_1 WHERE columns_1 = 'values_1' ) slave_1 JOIN ( SELECT id FROM slave_2 WHERE columns_2 = 'values_2' ) slave_2 函数中(对于匹配的最后一行,您将收到MAX(),即插入)。