0

我有这样的数据库结构::

数据库结构 ::

  • 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, ProductIDproject_ID它们在此表中是 FK,但在其他表中它们只是数字)。

现在,当我从用户输入数据时,我以字符串的形式输入数据,例如用户输入Name( Employee_Table)、product_Name( Product_table) 而不是直接输入 ID。所以我想首先让用户输入名称(EmployeeproductProjectEnv),然后提取其主键(Emp_ID, product_ID, project_ID, Env_ID)的值,然后将它们插入ATT_tableassignedtoID, assignedbyID, envID, ProductID, project_ID.

请注意,从中assignedtoID, assignedbyID引用。Emp_IDEmployee_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";  
4

2 回答 2

2

处理这种情况的方法是使用下拉选择列表。该列表由(至少)两列组成:一列保存 Id 的 teh 数据库,另一列存储用户看到的字符串。像

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 * ”作为名称,程序不会警告用户,因为某些内容已填写。但这不是数据库将执行的检查,因为在 Id 上定义了 NOT NULL 约束(FK )。当您从父表中一一获取ID时。您可以验证它们是否为 NOT 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"
于 2012-04-09T10:27:49.877 回答
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";

但我猜,在你的场景中使用下拉列表是最佳实践。

于 2012-04-09T10:32:02.667 回答