问题描述
我有多个通过几个不同的外键连接在一起的表(请参见附加图像)。
我正在尝试插入项目表中。我一直在尝试通过下面的以下代码来完成此操作,但是它不起作用。现在,我收到一条错误消息,说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"]."')";
因为您尝试将INSERT
和projects
和client.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()
,即插入)。