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

同一列是否可以对另一列具有主键和外键约束

余阳秋
2023-03-14
问题内容

同一列可以对另一列具有主键和外键约束吗?

Table1: ID - Primary column, foreign key constraint for Table2 ID
Table2: ID - Primary column, Name

如果我尝试删除table1数据,这会成为问题吗?

Delete from table1 where ID=1000;

谢谢。


问题答案:

这应该没有问题。考虑以下示例:

CREATE TABLE table2 (
   id int PRIMARY KEY,
   name varchar(20)
) ENGINE=INNODB;

CREATE TABLE table1 (
   id int PRIMARY KEY, 
   t2_id int, 
   FOREIGN KEY (t2_id) REFERENCES table2 (id)
) ENGINE=INNODB;

INSERT INTO table2 VALUES (1, 'First Row');
INSERT INTO table2 VALUES (2, 'Second Row');

INSERT INTO table1 VALUES (1, 1);
INSERT INTO table1 VALUES (2, 1);
INSERT INTO table1 VALUES (3, 1);
INSERT INTO table1 VALUES (4, 2);

这些表现在包含:

SELECT * FROM table1;
+----+-------+
| id | t2_id |
+----+-------+
|  1 |     1 |
|  2 |     1 |
|  3 |     1 |
|  4 |     2 |
+----+-------+
4 rows in set (0.00 sec)

SELECT * FROM table2;
+----+------------+
| id | name       |
+----+------------+
|  1 | First Row  |
|  2 | Second Row |
+----+------------+
2 rows in set (0.00 sec)

现在我们可以成功删除这样的行:

DELETE FROM table1 WHERE id = 1;
Query OK, 1 row affected (0.00 sec)

DELETE FROM table1 WHERE t2_id = 2;
Query OK, 1 row affected (0.00 sec)

但是,我们将无法删除以下内容:

DELETE FROM table2 WHERE id = 1;
ERROR 1451 (23000): A foreign key constraint fails

如果我们table1使用CASCADE选项定义了外键,那么我们将能够删除父项,并且所有子项都将被自动删除:

CREATE TABLE table2 (
   id int PRIMARY KEY,
   name varchar(20)
) ENGINE=INNODB;

CREATE TABLE table1 (
   id int PRIMARY KEY, 
   t2_id int, 
   FOREIGN KEY (t2_id) REFERENCES table2 (id) ON DELETE CASCADE
) ENGINE=INNODB;

INSERT INTO table2 VALUES (1, 'First Row');
INSERT INTO table2 VALUES (2, 'Second Row');

INSERT INTO table1 VALUES (1, 1);
INSERT INTO table1 VALUES (2, 1);
INSERT INTO table1 VALUES (3, 1);
INSERT INTO table1 VALUES (4, 2);

如果我们要重复之前失败的操作DELETEtable1则将删除其中的子行以及其中的父行table2

DELETE FROM table2 WHERE id = 1;
Query OK, 1 row affected (0.00 sec)

SELECT * FROM table1;
+----+-------+
| id | t2_id |
+----+-------+
|  4 |     2 |
+----+-------+
1 row in set (0.00 sec)

SELECT * FROM table2;
+----+------------+
| id | name       |
+----+------------+
|  2 | Second Row |
+----+------------+
1 row in set (0.00 sec)


 类似资料:
  • 问题内容: 在下表中输入值时,如何在SQL的同一表的列上强制使用外键约束: 员工人数 : 空号, 经理编号(必须是现有员工) 问题答案: 希望能帮助到你!

  • 我有一个带有多个主键的表,所以我必须创建可嵌入类。该键中的一列是另一个表的外键。如何为其创建JPA注释? 所以我只有3列,我试图创建4个注释。列是主键的一部分,也是不同表中的外键。我必须创建多通注释,但我收到: 外键引用POJO。来自POJO的ControlPlanSetup。ControlPlanLine的列数错误。应该是4

  • 问题内容: 在一个假设的场景中,我是没有表创建特权的用户。我想知道表中的列是否具有 UNIQUE CONSTRAINT 。是否可以在 词典中 查找?我将如何处理? 问题答案: 此处给出的两个答案都缺少一种在列上实施唯一性的方法:通过创建 唯一索引 (而不在列上定义唯一约束)。如果您不熟悉此选项,请参见这两个链接(一个,两个)。 除 唯一约束检查 外 ,还应执行此检查: 要检查唯一约束,请使用已经提

  • 我知道这个主题在这里讨论了很多次,但我仍然坚持一个例外:外键必须与引用的主键具有相同的列数。 (我正在使用spring数据和hibernate) 我的身份证类别: 我的实体: 对于这种构造,我得到以下例外情况: 导致:org.hibernate.MappingException:外键(FK_ad3h9gu4labg6ix34bei3poxt:proxy_dienst_关系[parent_diens

  • 我有域类 - 用户、角色、组、组角色 用户域 用户.hbm.xml 我有user_grouprole表作为一个连接表为一个用户和一组分组程序我有user_role表作为一个连接表为一个用户和一组角色 组域 Group.hbm.xml 组角色 GroupRole.hbm.xml 当我尝试使用主类进行测试时,我得到了一个映射错误,比如Hibernate映射错误,比如外键(FK5110401A83989

  • 问题内容: 只是为了扩展我以前的问题-我的数据库中有两个表,我想提取某些信息。下表: 您向我提供了以下代码来获取播放器的名称: 效果很好,谢谢-我只想进行两项调整: 我想返回得分手的名字以及球员的名字。由于m.scorer是一个ID,如果p.Name已被映射到m.playerID,我如何将其映射到p.Name属性? 上面的查询返回所有玩家的姓名。我很快就会添加搜索功能,您可以在其中搜索特定玩家的所