3

私はこのような2つのテーブルを持っています:

// Person.Details Table:
PersonID int [PK] | EmployeeCreatorID int [FK] | FirstName varchar | OtherInfo...

// Employee.Details Table:
EmployeeID int [PK] | PersonID int [FK] | IsAdmin bit | OtherInfo...

各テーブルは互いに関連しています。

[Employee.Details.PersonID]===>[Person.Details.PersonID] AND
[Person.Details.EmployeeCreatorID]===>[Employee.Details.EmployeeID]

それらの外部キーを介して。

問題は、外部キー制約の1つを削除し、行を挿入してから制約を追加し直さないと、最初の人/従業員を作成できないことです(これはかなり不自由です)。

ここで明らかな神のパラドックスは、最初の「従業員」はそれ自体を作成するために存在しないということです (「人」)。

2 つのテーブルに同時にデータを挿入する方法はありますか? この作成者が作成者であるというシナリオは、一度だけ発生する必要があります。データを 2 つのテーブルに同時に挿入できない場合、天才が提案する他の方法はありますか?

明確化

「生徒」や「保護者」など、「人物」テーブルに関連する他のテーブルがあります。個人はタイプを切り替えることはできません (従業員は学生または保護者に切り替えることはできません。また、その逆も同様です)。このパラドックスは、ManagerID FK を持つ Employee テーブルに似ています。私の場合を除いて、テーブルは分離されています。

ソリューション は、Remus Rusanu と b0fh に感謝します

--/*seeds database with first employee*/
BEGIN TRAN
GO
INSERT INTO Person.Details
    (EmployeeCreatorID, FirstName, Active)
VALUES
    (@@Identity, 'Admin', 1)
DECLARE @Identity int;
SET @Identity = @@Identity;
INSERT INTO Employee.Details 
    (PersonID, IsAdmin, Email, Password) 
VALUES
    (@Identity, 1, 'admin', 'admin')
UDPATE
    Person.Details
SET
    EmployeeCreatorID = @@Identity
WHERE
    PersonID = @Identity

IF(@@ERROR <> 0)
    ROLLBACK TRAN
ELSE
    COMMIT TRAN
4

5 に答える 5

3

NULL キーは外部キー制約を渡します。CreatorID が NULL の Person を挿入すると、これが階層全体の祖父になります。

また、制約を挿入して無効にし、相互にポイントする最初のペア (Person、Employee) を挿入してから、制約を再度有効にして、システムがシードされるようにすることもできます。

于 2010-02-25T00:05:09.503 に答える
2

SQLサーバーについてはわかりませんが、私が知っている他のDBMSでは、2つのステップが単一のトランザクション内にある限り実行できます。BEGIN;と の間で2 つのステートメントをラップするだけCOMMIT;です。

于 2010-02-25T00:01:03.767 に答える
1

私はむしろデータベースの設計を変更したいと思います。テーブルは、そのような方法で関連付けられるべきではありません。

于 2010-02-25T00:04:28.737 に答える
0

従業員である場合もそうでない場合もある人を作成するには、従業員を1人だけ持つ必要があります。唯一の問題は、従業員が自分で作成できないことです。したがって、最初の人をデータベースに入力する前に、employeecreatoridfkが必須の列ではないことを確認することをお勧めします。次に、人を作成します。次に、その関係者の従業員レコードを作成します。個人がいるので、従業員テーブルにpersonID FKを要求でき、それが存在します。次に、元のPersonレコードを更新して、EmployeeCreatorIdを新しく作成されたEmployeeIDと等しく設定します。次に、personテーブルのEmployeeCreatorIDFK列をrequiredに戻します。
ここで、新しい人が現在の従業員によってのみ作成されていることを確認する必要があります。これは、作成されている人ではありません。

This will avoid all needs to drop and recreate keys every time a new person is created. Good luck.

于 2010-02-25T02:09:00.377 に答える
0

モデルは私には欠陥があるように見えますが、要件をより良く説明する必要があるだけかもしれません。ここのところ:

  • すべての人は従業員によって作成されます。
  • 従業員は人です。

従業員以外の人はいますか? なぜ彼らはシステムにいるのですか?個人が従業員から非従業員に、またはその逆に切り替えることは可能ですか?

上記の質問に答えることができれば、より良い答えが得られると思いますが.. 1 つの提案は、EmployeeCreaterId を PersonCreatorId に変更し、PersonCreatorId が従業員であるという 2 番目の (データベース スキーマでは強制されない) 要件を持つことです。

于 2010-02-25T00:02:57.937 に答える