当前位置: 首页 > 面试题库 >

带外键的表列可以为NULL吗?

景鹏云
2023-03-14
问题内容

我有一个表,其中有几个ID列指向其他表。

我希望 只有 在将数据放入其中时,外键才能强制完整性。如果我稍后进行更新以填充该列,则它还应该检查约束。

(这可能取决于数据库服务器,我使用的是MySQL和InnoDB表类型)

我相信这是一个合理的期望,但是如果我错了,请纠正我。


问题答案:

是的,您只能在值不为NULL时强制执行约束。可以使用以下示例轻松测试它:

CREATE DATABASE t;
USE t;

CREATE TABLE parent (id INT NOT NULL,
                     PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (id INT NULL, 
                    parent_id INT NULL,
                    FOREIGN KEY (parent_id) REFERENCES parent(id)
) ENGINE=INNODB;


INSERT INTO child (id, parent_id) VALUES (1, NULL);
-- Query OK, 1 row affected (0.01 sec)


INSERT INTO child (id, parent_id) VALUES (2, 1);

-- ERROR 1452 (23000): Cannot add or update a child row: a foreign key 
-- constraint fails (`t/child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY
-- (`parent_id`) REFERENCES `parent` (`id`))

第一次插入将通过,因为我们在中插入了NULL parent_id。由于外键约束,第二次插入失败,因为我们试图插入parent表中不存在的值。



 类似资料:
  • 我有两张桌子: 用户(用户名、密码) 配置文件(profileId,gender,dateofbirding,...) 目前我正在使用这种方法:每个Profile记录都有一个名为“userid”的字段作为外键,它链接到用户表。当用户注册时,他的配置文件记录将自动创建。 我对我朋友的建议感到困惑:将“userid”字段作为外部和主键,并删除“profileid”字段。哪种方法更好?

  • 问题内容: 我目前正在为我们团队的项目设计数据库结构。我目前在脑海中有一个非常疑问的问题:能否将外键用作另一个表上的主键? 以下是我们系统的数据库设计表: 我想做的是,该表应包含学生用户和指导顾问用户的ID(应该是系统的登录凭据)和密码。简而言之,和表的主键也是表的外键。但我不确定是否允许。 另一个问题是:一个表中也存在,这需要一个(其为中表)和一个(这也是在)它的每个记录的。如果学生和辅导员的I

  • 问题内容: 因此,今天早上我问了一个问题,我没有正确说出这句话,所以我得到了很多关于为什么将NULL与任何东西相比会赋予NULL / FALSE的回答。 我的实际问题是,数据库专家测试两列都可以为NULL的不等式的时间受尊敬的方式是什么?我的问题与这个问题完全相反。 要求如下,A和B为两列: a)如果A和B都为NULL,它们相等,则返回FALSE b)如果A和B都不为NULL,则返回A <> B

  • 问题内容: 有没有一种方法可以使用SQL列出给定表的所有外键?我知道表名/架构,可以插入它。 问题答案: 您可以通过information_schema表来执行此操作。例如:

  • 问题内容: 好吧,这是我的问题,我有3张桌子;地区,国家,州。国家可以在区域内部,州可以在区域内部。地区是食物链的顶端。 现在,我添加一个带有两列的Popular_areas表;region_id和Popular_place_id。是否可以将Popular_place_id用作国家 或 州的外键。我可能将不得不添加一个Popular_place_type列,以确定ID是否以任何一种方式描述一个国家

  • 问题内容: 我拼凑了一个图片网站。基本模式是非常简单的MySQL,但是在尝试表示与图像相关联的可能的管理标志(“不合适”,“受版权保护”等)时遇到了一些麻烦。我目前的概念如下: (为了方便阅读而被截断;我发誓要搭配各种外键和索引) 在标志类型的查找表上是外键,并且您可以想象 应该 在上外键。现在的问题是,当第一次发出标志时,没有逻辑解析类型(我将其声明为的一种很好的用法)。但是,如果设置了值,则应