SQL外键

摘要:
一个表的外键可以是空值,若不为空值,则每一个外键值必须等于另外一个表中的主键的某个值。外键是一个表中的字段,他可以不是本表中的主键,但对应另外一个表的主键,外键的作用是保证数据引用的完整性。定义完外键后,不允许删除在另一表中具有关联的行。ONDELETE和ONUPDATE:指定在发生删除或更改的表中。

外键:外键是用来再两个表的数据之间建立连接,他可以是一列也可以是多列。一个表中可以有一个或多个外键。

一个表的外键可以是空值,若不为空值,则每一个外键值必须等于另外一个表中的主键的某个值。

外键是一个表中的字段,他可以不是本表中的主键,但对应另外一个表的主键,外键的作用是保证数据引用的完整性。

定义完外键后,不允许删除在另一表中具有关联的行。列如:部门表tb_dept的主键是id,在员工表tb_emp5中有一个键deptId跟这个id关联。

主表(父表):对于两个有关联的表而言,相关字段中主键所在的那个表为主表。

从表(子表):对于两个有关联的表而言,相关字段中的外键所在的那个表为从表。

外键名:定义外键约束的名称,一个表中不能有相同名称的外键。

字段名:表示从表需要添加外键约束的字段列。

主表名:即被从表外键所依赖的表的名称

主键列:表示主表中定义的主键字段,或者字段组合。

ON DELETE 和 ON UPDATE :指定在发生删除或更改的表中。

例子:

创建一个部门表tb_dept1,表结构SQL语句如下:

CREATE  TABLE  tb_dept1
(
     id  INT PRIMARY KEY,
     name  VARCHAR(22) NOT NULL,
    location  VARCHAR(50) NULL  
);

定义数据表tb_emp6,让它的键deptId作为外键关联到tb_dept1的主键id,SQL语句如下:

CREATE  TABLE tb_emp6
(
    id   INT  PRIMARY KEY,
    name  VARCHAR(25),
    deptId  INT,
    salary   FLOAT,
    CONSTRAINT  fk 员工部门编号  FOREIGN KEY(deptId)  REFERENCES tb_dept1(id) 
);

在未设外键表中添加外键 可以使用ALTER语句将FOREIGN KEY约束添加到该表中,添加主键的ALTER语句语法格式如下  

CREATE  TABLE tb_emp6
(
   id   INT  PRIMARY KEY,
   name  VARCHAR(25),
   deptId  INT,
   salary  FLOAT
)--创建表但未添加外键

后期添加外键SQL语法如下:

GO
ALTER  TABLE tb_emp6
ADD
CANSTRAINT fk 员工不猛编号
FOREIGN  KEY(deptId) REFERENCES  tb_dept1(id)

删除外键约束

删除tb_emp6表中创建的 “fk_员工部门编号”外键约束,输入语句如下:
ALTER TABLE tb_emp6
DROP CONSTRAINT fk_员工部门编号;

执行完成后将删除tb_emp6的外键约束。

免责声明:文章转载自《SQL外键》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySQL备份恢复之mydumperubuntu安装出现"删除initramfs-tools时出错",subprocess installed post-installation script returned error exit status 1下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

在数据库中使用外键和级联删除

前一阵子写了1个项目,这个项目有ios和android2个版本,都使用了sqlite数据库。数据库内容也不是太复杂,但是我们在操作时没有利用数据库的级联删除等功能,导致代码复杂,现在分析一下。 比如系统需要2个表,表Person表示人的信息, 包含personID,personName,  表Treatement表示治疗方案,包含用药名称,用药剂量,用药时...

更改mysql引擎后无法建立外键(navicat)

当我们使用navicat添加外键时,提示如下错误 首先考虑以下原因: 1:两个字段的数据类型和长度不匹配:例如一个是int一个是bigint 2:外键所参考的字段必须为主键 3:要设置外键的字段不能为主键 4:mysql表的引擎必须得是innodb(因为mysql默认引擎为MyISAM,但如果是这种情况的话,navicat不会报错,只会默默建立索引而不建...

Oracle临时表用法的经验心得 老猫

文章主要介绍的是Oracle临时表的实际用法的经验心得,我们目前所使用的 Oracle 是作为数据库支撑平台的实际应用,可以说其数据量还是算的上比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量。   当然在 Oracle 中创建分区是一种不错的选择,但是当你发现你的应用有多张表关联的时候,并且这些表大部分都是比较庞大,而你关联的时候发现其中的...

navicat内的主键和外键

数据库内的一个重点是主键另一个是外键 实体完整性{ 主键的全称:主关键字 它能够进行唯一标示某一列的 主键的三大特点是:唯一 非空 排序 一个没有主键的表不是一个完整的表,只要表设置了主键那么就会自动设置非空 当一个表诶出现多个主键时是组合主键,他两个的值是不能重复的,单列或者是组合列 附加内容: 自增长:必须是数字,不能是字母或者别的,不需要输入内容,...

10、JPA_映射双向多对多的关联关系

双向多对多的关联关系 双向多对多的关联关系(抽象成A-B)具体体现:A中有B的集合的引用,同时B中也有对A的集合的引用。A、B两个实体对应的数据表靠一张中间表来建立连接关系。 同时我们还知道,双向多对多的关联关系可以拆分成三张表,两个双向多对一关联关系。拆分以后还是有一张中间表,其好处就是可以在中间表中添加某些属性用作其它。这个后面会讲解。而单纯的双向多对...

Django-on_delete

一、外键的删除 关于on_delete的总结 1、常见的使用方式(设置为null) class BookModel(models.Model): """ 书籍表 """ book_name = models.CharField(max_length=100, verbose_name='书名') # 表示外键...