1

テーブル School とテーブル Teacher が 1 対多の関係にあります。ただし、そのうちの 1 人が校長であり、校長になれるのは 1 人だけです。そこで、次のように School テーブルに教師の ID (原則) を保存することを考えました。

CREATE TABLE School (
    ID INT PRIMARY KEY,
    Name VARCHAR(40),
    PrincipleID INT FOREIGN KEY REFERENCES Teacher.ID
)

CREATE TABLE Teacher (
    ID INT PRIMARY KEY,
    Name VARCHAR(40),
    SchoolID INT FOREIGN KEY REFERENCES School.ID
)

学校テーブルの外部キー参照を失う可能性があることは知っていますが、それはオプションではありません。

テーブルの作成後に参照を行う必要がありますか? はいの場合、どのように?

4

4 に答える 4

3

もう 1 つの解決策は、新しいテーブルを作成することです。たとえば、2 つのフィールドだけを持つ SchoolsPrinciples を考えてみましょう。

CREATE TABLE SchoolsPrinciples
(
  SchoolId int,
  TeacherId int,
  CONSTRAINT uc_SchoolTeacher UNIQUE (SchoolId, TeacherId)
)

UNIQUE 制約により、学校ごとに 1 人の教師を取得できます。

于 2012-06-19T20:32:20.327 に答える
2

テーブルを作成するときは、制約を個別の alter ステートメントとして追加する必要があります。また、外部キーを作成するときは、参照される列ではなく、テーブル名のみを指定する必要があることに注意してください (列は主キーによって暗示されます)。

CREATE TABLE School (
    ID INT PRIMARY KEY,
    Name VARCHAR(40),
    PrincipleID INT);

CREATE TABLE Teacher (
    ID INT PRIMARY KEY,
    Name VARCHAR(40),
    SchoolID INT 
      CONSTRAINT FK_Teacher_School 
      FOREIGN KEY REFERENCES School);

ALTER TABLE School add
    CONSTRAINT FK_School_Teacher 
    FOREIGN KEY (PrincipleID) REFERENCES Teacher;

データを追加するときは、別の更新として PrincipleID フィールドを設定する必要があります。

insert into School (ID, Name)
values (1, 'Blarg Elementary');

insert into Teacher (ID, Name, SchoolID)
values (1, 'John Doe', 1),
       (2, 'Bob Smith', 1),
       (3, 'Adam Walker', 1);

update School set PrincipleID = 2 where ID = 1;
于 2012-06-19T20:27:42.757 に答える
1

Teacher テーブルの列を次のように取得できます

  1. IsPrincipalここで、jonnyGold によって参照されるように、1 つの行だけが true の値を持ちます。

          This can be checked by triggers.
                        OR
          You can use filtered index if using Sql Server 2008.
               Create unique filtered index where SchoolID, IsPrincipal 
               is NOT NULL and are unique
    
  2. これにはプリンシパルの ID が含まれるため、作成employee manager relationshipするのは適切ではありません。

CREATE TABLE EmpManager ( TeacherID int SchoolID int IsPrincipal bit ) フィルター選択されたインデックスまたはトリガーを使用してシナリオを処理します。

編集:

CREATE TABLE [dbo].[Teacher](
    [ID] [int] NOT NULL primary key,
    [Name] [varchar](40) NULL,
    [SchoolID] [int] NULL,
) 
GO

CREATE TABLE [dbo].[School](
    [ID] [int] NOT NULL primary key,
    [Name] [varchar](40) NULL,
    [PrincipleID] [int] NULL,
)
GO

ALTER TABLE [dbo].[Teacher]  WITH CHECK ADD  CONSTRAINT [FK_Teacher_School] FOREIGN KEY([SchoolID])
REFERENCES [dbo].[School] ([ID])
GO

ALTER TABLE [dbo].[School]  WITH CHECK ADD  CONSTRAINT [FK_School_Teacher] FOREIGN KEY([PrincipleID])
REFERENCES [dbo].[Teacher] ([ID])
GO

ここに画像の説明を入力

より良い設計は、ADC によって提案されたものであるべきです

ここに画像の説明を入力

于 2012-06-19T20:27:32.853 に答える
1

代わりにブール値IsPrincipalTeacherテーブルに置きます。または、3 番目の関係テーブルを追加します

CREATE TABLE SchoolPrincipals (
  INT SchoolID PRIMARY KEY FOREIGN KEY REFERENCES School.ID,
  INT TeacherID FOREIGN KEY REFERENCES Teacher.ID
)

面倒な削除ロジックを使用せずに、すべてを整理します。

于 2012-06-19T20:23:36.097 に答える