2

テーブル間の FK リレーションシップが実装されていない既存の SQL 2005 データベースを使用しています。データベース ダイアグラムを使用してリレーションシップを追加しようとしたところ、新しい FK に関連付けられているデータを編集または挿入しようとして、アプリケーションがすぐに爆発しました。

dbo.person [person_id | firstname | lastname | dateofbirth]
dbo.campaign [campaign_id | campaign_description]
dbo.disposition [disposition_id | disposition_description]
dbo.person_campaigns [person_campaign_id | person_id | campaign_id | disposition_id]

person_campaigns テーブルは、個人、キャンペーン、および処分が結び付けられている場所です。これらのエンティティ間に適切な FK 関係を追加するための適切な SQL 構文を教えてください。

編集

CREATE TABLE [dbo].[person_campaigns](
    [person_campaigns_id] [int] IDENTITY(1,1) NOT NULL,
    [person_id] [int] NOT NULL,
    [d_campaign_id] [int] NOT NULL,
    [d_physician_disposition_id] [int] NULL,
 CONSTRAINT [PK_person_campaigns] PRIMARY KEY CLUSTERED 
(
    [person_campaigns_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

CREATE TABLE [dbo].[d_campaign](
    [d_campaign_id] [int] IDENTITY(1,1) NOT NULL,
    [name] [varchar](50) NULL,
    [year] [int] NULL,
    [isactive] [bit] NOT NULL,
 CONSTRAINT [PK_d_campaign] PRIMARY KEY CLUSTERED 
(
    [d_campaign_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[d_campaign] ADD  CONSTRAINT [DF_d_campaign_isactive]  DEFAULT ((1)) FOR [isactive]
GO

CREATE TABLE [dbo].[d_disposition](
    [d_disposition_id] [int] IDENTITY(1,1) NOT NULL,
    [name] [varchar](50) NULL,
    [isactive] [bit] NOT NULL,
 CONSTRAINT [PK_d_disposition] PRIMARY KEY CLUSTERED 
(
    [d_disposition_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[d_disposition] ADD  CONSTRAINT [DF_d_disposition_isactive]  DEFAULT ((1)) FOR [isactive]
GO

CREATE TABLE [dbo].[person](
    [person_id] [int] IDENTITY(1,1) NOT NULL,
    [firstname] [varchar](30) NULL,
    [lastname] [varchar](30) NULL,
    [dateofbirth] [datetime] NULL
 CONSTRAINT [PK__person__0BC6C43E] PRIMARY KEY CLUSTERED 
(
    [person_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
4

4 に答える 4

4

これを行う最も簡単な方法は、データベース ダイアグラム エディターを使用することです。それらを一度に 1 つずつ実行し、ダイアグラムを保存して、接続が確立されるたびにテーブルに影響を与えます。「爆発」した場合、テーブルに存在しない外部キー値が含まれている可能性が最も高いです。最初にこれらをクリーンアップする必要があります。

于 2009-03-17T04:13:52.917 に答える
2

テーブルの作成後にそれらを追加する必要がある場合、構文は次のとおりです。

 create table  person (person_id int primary key 
,firstname varchar(10)
, lastname varchar(10)
, dateofbirth varchar(10))

create table campaign (campaign_id int primary key
, campaign_description varchar(10))
create table  disposition (disposition_id int primary key  
,disposition_description varchar(10))

create table person_campaigns(person_campaign_id int
,person_id int, campaign_id int ,disposition_id int)
go
alter table person_campaigns  add Constraint 
fk_person_campaigns_person_id
Foreign Key (person_id) References person(person_id)
GO

alter table person_campaigns add Constraint 
fk_person_campaigns_campaign_id
Foreign Key (campaign_id) References campaign(campaign_id)
GO

alter table person_campaigns add Constraint
fk_person_campaigns_disposition_id
Foreign Key (disposition_id) References disposition(disposition_id) 

GO
于 2009-03-17T04:02:59.653 に答える
2

外部キーを持っているはずなのに持っていない 2 つのテーブルがあるとします。まず、外部キーを設定するとデータに問題がないかどうかを確認します。

以下のコードのようなものは、親テーブルに一致しない子テーブルのレコードを取得します。

select t2.FKField, t2.PKfield from table2 t2
left join Table1 t1 on t2.fkfield = t1.pkfield
where t1.pkfield is null

既存のデータの問題点がわかったら、それを修正する方法を作成する必要があります。修正は、親テーブルと関係のないデータと、テーブルが何を表しているかによって異なります。親テーブルに自動車の VIN 番号が PK として含まれているとします。子テーブルにショップが作業した車が含まれている場合、作業の履歴を失いたくないため、存在しない VINS をプライマリ テーブルに追加して問題を解決する必要があります。意味がないため、子テーブルで一致しないレコードを単純に削除したい構造が他にもあります。他の状況では、これらのレコードを何らかのデフォルト値 (たとえば、unknown と呼ばれる顧客テーブル内の顧客) に更新したい場合があります。さらに他の状況では、関連する子レコードが削除されずに削除された PK の値を見つけるために、監査テーブルまたはバックアップに移動する必要がある場合があります。この問題を解決する実際の方法は、データの用途と、すべての履歴記録を保持することがどれほど重要かによって大きく異なります。法的な (および会計上の) 理由で、金融取引に関連する可能性のある記録は決して削除してはならないため、これらには細心の注意を払う必要があります。

すべてのデータを修正したら、コードを実行して FK 制約を作成します。

于 2009-03-17T14:41:29.510 に答える
0

この PC には SQL Server がなく、構文も覚えていないため、最も簡単な方法は、2 つの新しいテスト テーブルを作成し、ID フィールドを持つ TableA を作成し、TableA の FK であるフィールドを持つ TableB を作成することです。 .ID を入力し、TableB をスクリプト化して ADD CONSTRAINT 構文を確認します。これは、データベース ダイアグラムを介して SQL Server Management Studio を使用して行います。

ただし、データ ダイアグラムで FK を正常に作成でき、レコードの追加または更新しかできない場合は、何か他のことが間違っていると思います。person_campaigns テーブルをスクリプト化し、コードを投稿します。

于 2009-03-17T03:46:33.640 に答える