回答

收藏

与FK关系意味着什么/应该是什么?NULL-数据库

技术问答 技术问答 351 人阅读 | 0 人回复 | 2023-09-14

我在关系SQL在数据库中创建FK在工作中进行了简短的讨论后,我们意识到我们有一个空的列,这很可能是造成这个问题的原因。我将永远NULL视为未分配、未指定、空白等含义,实际上从未见过这样的问题。; b  Z# I1 m, C. p! F
我和其他开发人员交谈的人认为,处理两个实体之间关系的唯一方法是创建一个连接两个实体数据的表…
. p! g+ u( o0 g. W在我看来,至少可以直观地说,包含另一个表中ID如果列不为null,它必须有另一个表中ID,但如果是NULL,它可以继续移动。这似乎与某些人的言论和建议相矛盾。
( j- F, v. N- a* ^  T, ~处理两个表之间可能存在关系,如果指定了一个值,那么该值必须在另一个表中的最佳实践或正确方法是什么?…
* D$ I5 y3 r% M9 I) X0 Y# Q                                                               
2 ~/ r. H9 P( k6 _( G6 S6 M    解决方案:                                                                ) v. U0 c" n% y! p$ j
                                                                这是完全可以接受的,这意味着如果列有任何值,它的值必须存在于另一个表中。(我看到其他答案也有这样的说法,但我希望有所不同。$ q1 K2 z% M. p! @; U+ W
考虑到车辆和发动机表,发动机还没有安装在车辆中(因此VehicleID空)。或者有主管列和公司CEO的Employee表。4 U% _2 \4 @' r3 V: P
更新:根据Solberg这是两个外键关系表的示例,显示外键字段值 可以    为null。
  k' p; D2 S4 S7 ^; {CREATE TABLE [dbo].[EngineTable](    [EngineID] [int] IDENTITY(1,1) NOT NULL,   [EngineCylinders] smallint NOT NULL,CONSTRAINT [EngineTbl_PK] PRIMARY KEY NONCLUSTERED  [EngineID] ASC)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]CREATE TABLE [dbo].[CarTable](    [CarID] [int] IDENTITY(1,1) NOT NULL,   [Model] [varchar](32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,   [EngineID] [int] NULL CONSTRAINT [PK_UnitList] PRIMARY KEY CLUSTERED  [CarID] ASC)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]ALTER TABLE [dbo].[CarTable]  WITH CHECK ADD CONSTRAINT [FK_Engine_Car] FOREIGN KEY([EngineID])REFERENCES [dbo].[EngineTable] ([EngineID])Insert Into EngineTable (EngineCylinders) Values (4);Insert Into EngineTable (EngineCylinders) Values (6);Insert Into EngineTable (EngineCylinders) Values (6);Insert Into EngineTable (EngineCylinders) Values (8);-现在进行一些测试:
  J# j& S& r6 N- X6 k4 V: OInsert Into CarTable (Model,EngineID) Values ('G35x3);  -- References the third engineInsert Into CarTable (Model,EngineID) Values ('Sienna  -- Invalid FK reference - throws an errorInsert Into CarTable (Model) Values ('M');  -- Leaves null in the engine id field & does NOT throw an error
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则