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 表是将人员、活动和处置联系在一起的地方。您能否提供适当的 SQL 语法以在这些实体之间添加正确的 FK 关系?

编辑

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

最简单的方法是通过数据库图表编辑器;一次做一个并保存图表以在每次连接后影响表格。如果它“炸毁”,很可能是因为表包含不存在的外键值;你必须先清理这些。

于 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

假设我有两个应该有外键但没有的表。首先要做的是检查如果我设置外键是否会出现数据问题。

类似于以下代码的内容将为您提供子表中在父表中没有匹配项的记录。

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 添加到主表来解决此问题,因为您不想丢失所处理内容的历史记录。在其他结构中,您可能只想删除子表中不匹配的记录,因为它们没有意义。在其他情况下,您可能希望将这些记录更新为某个默认值(可能是客户表中称为未知的客户)。在其他情况下,您可能需要转到审计表或备份以查找在未删除关联子记录的情况下删除的 PK 的值。解决此问题的实际方法在很大程度上取决于数据的用途以及保留所有历史记录的重要性。由于您永远不应该出于法律(和会计)原因删除任何可能与金融交易相关的记录,因此您需要非常小心。

修复所有数据后,运行代码来创建 FK 约束。

于 2009-03-17T14:41:29.510 回答
0

由于我在这台 PC 上没有 SQL Server 并且我不记住语法,所以最简单的方法是创建两个新的测试表,使用 ID 字段创建 TableA,使用 TableA 的 FK 字段创建 TableB .ID,然后编写 TableB 以查看 ADD CONSTRAINT 语法。通过数据库图使用 SQL Server Management Studio 执行此操作。

但是,如果您能够在数据图中成功创建 FK,并且您只能添加或更新记录,我相信还有其他问题。编写 person_campaigns 表并发布代码。

于 2009-03-17T03:46:33.640 回答