外键必须要建在主表的主键之上

本文详细介绍了SQL创建表、添加主键、构建外键约束的过程,并通过实例展示了错误处理及解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL>
SQL>
SQL>
SQL>
SQL> create table a(id number,name varchar2(32));

Table created.

SQL> create table b(pid number,name varchar2(32));

Table created.

SQL> alter table b add constraint FK_B foreign key (pid) references a (ID) ;
alter table b add constraint FK_B foreign key (pid) references a (ID)
                                                                  *
ERROR at line 1:
ORA-02270: 此列列表的唯一关键字或主键不匹配


SQL> alter table a add constraints pk_a primary key(id);

Table altered.

SQL> alter table b add constraint FK_B foreign key (pid) references a (ID) ;

Table altered.

SQL>

 

 

1 外键是针对从表的

2 主表一定要有主键,否则在从表中建不了外键

 

### 数据库中主键的定义及其作用 #### 主键 (Primary Key) 主键是在数据库表中用来唯一标识每条记录的一个或一组字段。它具有两个重要特性: 1. **唯一性**:主键值在表中必须是唯一的,不能存在重复值[^2]。 2. **非空性**:主键字段不能为空值(NULL)。 例如,在一个学生表中,如果每个学生的学号都是独一无二的,则可以将“学号”设置为主键来确保每一行数据都能被唯一区分[^3]。 主键的作用在于保障数据的完整性以及提高查询效率。通过主键索引,能够快速定位特定的数据行并执行操作。 #### (Foreign Key) 是用来建立和加强不同表之间联系的一种约束条件。具体来说,某个表中的是指向另一个表主键的字段。这有助于维持数据之间的参照完整性,防止非法数据进入关联表中。 以为例说明其功能时可考虑如下场景:假设有一个学生表包含“学号”,还有一个专业信息表包含“专业编号”。当我们在学生表里增加了一个名为“专业编号”的列,并将其设定成指向专业信息表里的“专业编号”这一主键时,“专业编号”就成为了学生表中的一部分[^4]。这种设计使得两表间形成了逻辑上的连接关系——即每位学生都对应着某项具体的专长领域。 #### 主键的区别及相互作用 虽然两者均服务于增强数据库结构的目的,但它们各自扮演的角色有所不同: - 主键负责本表内部各条目间的区别; - 而则跨越多张表格构建起更广泛意义上的网络体系,从而实现跨表检索等功能需求。 以下是基于上述理论的实际应用案例展示如何利用Python代码创建带有主键约束的SQLite数据库: ```sql CREATE TABLE Major ( major_id INTEGER PRIMARY KEY, name TEXT NOT NULL, description TEXT ); CREATE TABLE Student ( student_id INTEGER PRIMARY KEY, first_name TEXT NOT NULL, last_name TEXT NOT NULL, gender TEXT CHECK(gender IN ('M', 'F')), major_id INTEGER, FOREIGN KEY(major_id) REFERENCES Major(major_id) ); ``` 此脚本首先建立了`Major`表并将其中的`major_id`设为该表的主键;接着又新建了第二个叫做`Student`的新实体集对象同时指定它的某些属性如`student_id`作为自身的主关字之还引入了一种新的概念叫作部链接(`FOREIGN KEY`)绑定至先前已存在的那个学科分类列表上形成紧密耦合型态以便后续进一步开发过程中得以充分利用这些预先规划好的元数据模型架构优势所在之处体现得淋漓尽致! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值