2012-03-17 15 views
0

私はかなりMySQLを新しくしています。私はKlients(KID、名前、姓)とVisits(VID、VKID、dateOfVisit)の2つの関連テーブルを持っています.VKIDはKlient IDです。私は適切なINSERTクエリに問題があります。これは私がやりたいことです: 1.特定の名前と姓のKlientが存在するかどうかを確認します(同じ姓の人はいないとします)。 2.はいIDを取得し、訪問者へのINSERTテーブルを実行します 3.新しいクライアントを挿入し、IDを取得し、訪問をINSERTします。複雑なINSERTクエリ

1つのクエリで実行できますか?

+0

1つのクエリのようには聞こえません。 – Randy

+0

多分取引ですか? – user1091733

+0

関連する質問があります。これはおそらく http://stackoverflow.com/questions/4940283/conditional-mysql-statement-if-true-update-if-false-insert – gastonfartek

答えて

1

INSERT文は、ただ1つのターゲット表を可能にbwloリファレンスを参照してください。

したがって、トリガーやストアドプロシージャを使用しない限り、探しているクエリは不可能です。

しかし、このような問題は、一般休閑小さなアルゴリズム使用して解決される:

1)[訪問]親レコードがテーブルの[Klients]

INSERT INTO Visits (VKID, dateOfVisit) 
SELECT KID, NOW() 
FROM Klients 
WHERE ([email protected]) AND ([email protected]) 

2に存在すると仮定して)テーブルにレコードを挿入します(1)

3)レコードが挿入されていない場合は、新しいレコードテーブル[Klients]を追加してから、再度(1)を実行します。

1

は、私はそれをテストしていない

2番目の挿入に「VALUES」を指定する必要はありません。この

IF (SELECT * FROM `sometable` WHERE name = 'somename' AND surname = 'somesurname') IS NULL THEN 
INSERT INTO Table1(name,surname) VALUES ('somename', 'somesurname'); 
ELSE INSERT INTO visits(kid,name,surname) 
    SELECT kid, name, surname FROM Table1 WHERE name = 'somename' AND surname = 'somesurname'; 
END IF; 

ような何かをしようとするが、これは、あなたがしようとしているかの一般的な考え方であります達成する。

+0

私は1064エラーが発生しているので、私のニーズに合っているように見えます[前] [コード]存在しない場合(SELECT * FROM 'Klients' WHERE'姓 '= 'スミス')THY INSERT INTO 'Klients'(' name'、 'surname')VALUES( 'Adam'、 'Smith'); ELSE INSERT INTO 'Visits'(' VKID') 'Klients'から' KID'を選択WHERE 'surname' = 'Smith'; END IF; [/ code] – user1091733

+0

申し訳ありませんが、私のコメントでコードの書式を設定する方法を理解できません。 – user1091733

1

これらは、トランザクション内の2つのクエリする必要があります:

INSERT INTO Klients (name, surname) 
VALUES ('John', 'Doe') 
ON DUPLICATE KEY UPDATE 
KID = LAST_INSERT_ID(KID); 

INSERT INTO Visits (VKID, dateOfVisits) 
VALUES (LAST_INSERT_ID(), NOW()); 

最初の文は、更新部分が広く知られていない使用しUPSERT文があるが、(LAST_INSERT_IDの目的の機能のために正確にintented)、明示的にその後に値を取得するために渡された値が格納されます。

UPD:(surname、name)にユニーク制約を追加する必要があることを忘れてしまいました。