0

わかりました、これが私がやりたいことです。


Table1( globalID [主キー、自動インクリメント] (PHP で使用するグローバル ID です))


Table2 & table3( ID * [外部の主キー、globalID を参照]、この後の他の列、テーブル 2 と 3 ごとに異なる);


私が知りたいのは、table2またはtable3に行を挿入すると、talbe1のglobalIDが入力され、それに応じてtable2またはtable3に値が挿入されるようにする方法と方法があるかどうかです。トリガーで達成できると思いますが、トリガーは私の得意分野ではないので、それが唯一の方法である場合は、例を挙げてください。

私はまた、それをこのシナリオに拡張することも考えていました:


Table1( globalID [主キー、自動インクリメント] (PHP で使用するグローバル ID です), OtherID [UUID]);


Table2 & table3( ID * [外部の主キー、OtherID を参照]、この後の他の列、テーブル 2 と 3 ごとに異なる);


しかし、その場合でも、テーブルに新しい行を挿入する際に 2 人のユーザーが同じ UUID を生成する可能性はほとんどありません。PHPサーバー側でコーディングしなくても、SQLサーバーによって生成されたキーを自動的に作成することで、それを回避できるかどうか疑問に思っていました。

誰かがこの問題を解決したことがあり、私が注意したり考慮したりする必要がある他のことを指摘できる場合は、それらを指摘してください. また、解決例を教えてください。


編集:

@ジョンB.

TosheXによる編集

返信してくれてありがとう。それまでの間、私はこれについて読んでおり、SQL以外のソリューション(php)をすでに持っています。基本的に、Yii PHP フレームワークを使用してテーブルのモデルを作成し、アクティブなレコードを作成して新しい行を作成します。これを行うと、table1 の ID が生成され、その後、入力された行を指す変数がまだあり、生成された ID は自動的にフェッチされるため、読み取ることができます (データベースの最後のレコードを確認する必要はありません)。これは、誰かが作成したレコードを数ミリ秒後に返す可能性があります)。その後、適切な table2 または 3 内に行を作成し、既に生成された値を ID に割り当てるだけです。

ここでアイデアを見つけました:

http://www.yiiframework.com/forum/index.php/topic/14593-alternate-for-mysql-insert-id/

私は本当にデータベースに組み込みのソリューションが欲しかったのですが、データベースの経験があり、トリガーについて十分に知っているので(トリガーが好きではないのに十分です:D)、正しく理解するのが非常に難しいコードであることを知っているので、代替案があるかどうか疑問に思っていました自動入力などに。

それでも、お時間を割いてご回答いただき、誠にありがとうございました。私もmsSQLでもっと働いていて、あなたの言ったことに論理を見つけました。mySQL の UUID は msSQL の GUID と同じであり、ご覧のとおり、それも考慮しました。

これらすべてを考慮して、私が見つけた解決策を採用しますが、あなたが助けようとし、いくつかの良いアイデアをテーブルにもたらしたので、あなたの答えを受け入れます.

再度、感謝します。

4

1 に答える 1

0

私はmssqlの人ですが、データベースの「BEFORE INSERT」トリガーを作成できない限り(それでも問題になるでしょう)、それは可能だとは思いません。

テーブル 2 と 3 の ID が何であれ、整数であろうと GUID であろうと、これらは主キーです。この列を null にしてから、Table1 に新しい行を生成し、そのテーブルの新しい値を使用して、Table2 または Table3 の新しい行を更新します。

したがって、おそらく次のいずれかを行う必要があります。

最初に Table1 に新しい行を作成し、その後 Table2/3 に作成するときにこの値を使用するコードで (つまり、SQL の外部で) 解決策を実行するか、または:

テーブル2/3には、主キーの自動インクリメント列があり、それを「PK」と呼び、IDを別の通常のFKとして持ちますが、nullを許可し、次のようにトリガーを追加します(ただし、構文を少しいじる必要があるかもしれません、私は mssql の人であり、あなたのデータベースの構文がわからないためです) :-(

また、この例は、複数の行の挿入で動作するように設計されており、これを実現するためにカーソルを使用しています。カーソルの構文は、mssql でもせいぜい危険です!

CREATE TRIGGER trg_Table2 ON dbo.Table2
FOR INSERT   /* might be AFTER INSERT etc */
AS BEGIN
  SET nocount on;

  Declare ICursor Scroll For SELECT PK FROM Inserted;
  Declare @PK int,
          @GlobalID int,
          @ID guid;

  OPEN ICursor
  FETCH Next From ICursor INTO @PK
  WHILE @@Fetch_Status BEGIN
    INSERT Table1 (OtherID) VALUES (NewID());
    SELECT @GlobalID = @@Identity 
    SELECT @ID = OtherID FROM Table1 WHERE GlobalID = @GlobalID
    UPDATE Table2 SET ID = @ID WHERE PK = @PK

    FETCH Next FROM ICursor INTO @PK
  END
  Close ICursor
  Deallocate ICursor
END

お役に立てれば

于 2012-08-24T04:21:20.000 に答える