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、このテーブルでは FK ですがassignedbyID、他のテーブルでは主キーは単に数値です)。envIDProductIDproject_ID

ユーザーからデータを入力するときは、 ID を直接入力するのではなく、ユーザーがName( Employee_Table)、product_Name( ) を入力するような文字列の形式でデータを取得します。Product_tableしたがって、最初にユーザーに名前 (EmployeeまたはproductまたはProjectまたはEnv) を入力させ、次にその主キーの値 ( ) を取得してから、 の代わりにEmp_ID, product_ID, project_ID, Env_ID挿入します。ATT_tableassignedtoID, 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";  
4

2 に答える 2

2

これを処理する方法は、ドロップダウン選択リストを使用することです。リストは(少なくとも)2つの列で構成されます。1つはデータベースが動作するIDを保持し、もう1つはユーザーに表示される文字列を格納します。好き

1, "CA", "Canada"
2, "USA", 'United States"
...

ユーザーに表示される

CA | Canada
USA| United States  
...

データベースに保存される値は、ユーザーが選択した1、2、...の行です。

ユーザーの正確で正しい入力に頼ることはできません。遅かれ早かれ、彼らはタイプミスをするでしょう。


私はあなたの発言に基づいて私の答えを拡張します。

与えられた解決策(入力されたテキストですべての親テーブルを結合し、それらをいくつかのANDと組み合わせることによって、親テーブルからIDを取得する)の問題は、1つの与えられたパラメーターにタイプミスがあるとすぐに得られないことです。シングルレコードバック。従業員の実際のF_nameが「Shant*anu *」であり、ユーザーが「Shant * aun *」と入力した場合の結果を想像してみてください。

これに対処する最善の方法は、親テーブルからそれらのIDを1つずつ取得することです。一部のFKにNOTNULL制約があるとします。F_nameが入力されているかどうかを確認し、そのフィールドに入力しなかった場合はユーザーに通知できます。ユーザーが名前として「Shant*aun *」を入力したとすると、何かが入力されているため、プログラムはユーザーに警告しません。ただし、ID(FK)にNOT NULL制約が定義されているため、データベースが行うチェックではありません。 )。親テーブルからIDを1つずつ取得する場合。それらが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

ORの代わりにANDを使用してください。

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 に答える