微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过多个外键插入多个表

如何解决通过多个外键插入多个表

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

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"]."')";

解决方法

退后一步,考虑一下您正在建模的关系。您已经告诉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) ...
,

这是错误的:

$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,$_POST["ProjectManager_Name"],'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_Phone"],$_POST["ProjectManager_Name"]);
/* execute prepared statement */
mysqli_stmt_execute($stmt);
/* close statement and connection */
mysqli_stmt_close($stmt);

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

模式:

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(),即插入)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。