我的数据库结构如下::
数据库结构::
ATT_table- ActID(PK), assignedtoID(FK), assignedbyID(FK), Env_ID(FK), Product_ID(FK), project_ID(FK), Status
Product_table - Product_ID(PK), Product_name
Project_Table- Project_ID(PK), Project_Name
Environment_Table- Env_ID(PK), Env_Name
Employee_Table- Employee_ID(PK), Name
Employee_Product_projectMapping_Table -Emp_ID(FK), Project_ID(FK), Product_ID(FK)
Product_EnvMapping_Table - Product_ID(FK), Env_ID(FK)
我想在ATT_Table
中插入值。现在在该表中,我有一些列,例如assignedtoID
,assignedbyID
,envID
,ProductID
,project_ID
,这些列在此表中为FK,但在其他表中为主键他们只是数字)。
现在,当我从用户输入数据时,我会以字符串的形式输入数据,例如用户输入Name
(Employee_Table
),product_Name
(Product_table
)和不是ID直接。所以我想先让用户输入名称(Employee
或product
或Project
或Env
),然后输入其主键值Emp_ID, product_ID, project_ID, Env_ID
拾取然后将它们插入ATT_table
代替assignedtoID, assignedbyID, envID, ProductID, project_ID
。
请注意,assignedtoID, assignedbyID
引用了Emp_ID
Employee_Table
。
怎么做?我有类似的东西,但它不起作用::
INSERT INTO ATT_TABLE(Assigned_To_ID,Assigned_By_ID,Env_ID,Product_ID,Project_ID)
VALUES (A, B, Env_Table.Env_ID, Product_Table.Product_ID, Project_Table.Project_ID)
SELECT Employee_Table.Emp_ID AS A,Employee_Table.Emp_ID AS B, Env_Table.Env_ID, Project_Table.Project_ID, Product_Table.Product_ID
FROM Employee_Table, Env_Table, Product_Table, Project_Table
WHERE Employee_Table.F_Name= "Shantanu" or Employee_Table.F_Name= "Kapil" or Env_Table.Env_Name= "SAT11A" or Product_Table.Product_Name = "ABC" or Project_Table.Project_Name = "Project1";
答案 0 :(得分:2)
处理方法是使用下拉选择列表。该列表包含(至少)两列:一列保存Id的数据库,另一列保存用户看到的字符串。喜欢
1, "CA", "Canada"
2, "USA", 'United States"
...
用户看到
CA | Canada
USA| United States
...
存储在数据库中的值是1,2,...用户选择的任何行。
您永远不能依赖用户的准确,正确的输入。他们迟早会犯错误。
我根据你的评论扩展我的答案。
给定解决方案的问题(通过输入的文本将所有这些父表连接在一起并通过将多个AND组合在一起来从父表中获取Id)是一旦给定参数有拼写错误,将不会记录回来。想象一下当员工的真实F_name是“Shant * anu * ”并且用户输入“Shant * aun * ”时的后果。
解决这个问题的最佳方法是从父表中逐个获取这些Id。假设一些FK具有NOT NULL约束。您可以检查F_name是否已填写,并在用户未填写该字段时通知用户。假设用户输入“Shant * aun * ”作为名称,程序将不会警告用户,因为填写了某些内容。但这不是数据库将要执行的检查,因为NOT NULL约束在Id(FK)上定义。当您从父表中逐个获取Id时。您可以验证它们是否为NULL。当填写文本时,如“Shant * aun * ”,但返回的Id为NULL,您可以告知用户问题并让他更正他的输入:“没有员工的名字可以找到'Shantaun'。“
SELECT $Emp_ID_A = Emp_ID
FROM Employee_Table
WHERE F_Name= "Shantanu"
SELECT $Emp_ID_B = Emp_ID
FROM Employee_Table
WHERE B.F_Name= "Kapil"
SELECT $Env_ID = Env_ID
FROM Env_Table
WHERE Env_Table.Env_Name= "SAT11A"
SELECT $Product_ID = Product_ID
FROM Product_Table
WHERE Product_Table.Product_Name = "ABC"
SELECT $Project_ID = Project_ID
FROM Project_Table
WHERE Project_Name = "Project1"
答案 1 :(得分:1)
请使用 AND 代替 OR 。
INSERT INTO ATT_TABLE(Assigned_To_ID,Assigned_By_ID,Env_ID,Product_ID,Project_ID)
SELECT A.Emp_ID, B.Emp_ID, Env_Table.Env_ID, Project_Table.Project_ID, Product_Table.Product_ID
FROM Employee_Table A, Employee_Table B, Env_Table, Product_Table, Project_Table
WHERE A.F_Name= "Shantanu"
AND B.F_Name= "Kapil"
AND Env_Table.Env_Name= "SAT11A"
AND Product_Table.Product_Name = "ABC"
AND Project_Table.Project_Name = "Project1";
但我认为最好在您的方案中使用下拉列表。