外键约束 举例
关于外键约束

关于外键约束外键约束外键约束(FOREIGN KEY,缩写FK)是⽤来实现数据库表的参照完整性的。
外键约束可以使两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性。
外键是指表中某个字段的值依赖于另⼀张表中某个字段的值,⽽被依赖的字段必须具有主键约束或者唯⼀约束。
被依赖的表我们通常称之为⽗表或者主表,设置外键约束的表称为⼦表或者从表。
举个例⼦:如果想要表⽰学⽣和班级的关系,⾸先要有学⽣表和班级表两张表,然后学⽣表中有个字段为stu_clazz(该字段表⽰学⽣所在的班级),⽽该字段的取值范围由班级表中的主键cla_no字段(该字段表⽰班级编号)的取值决定。
那么班级表为主表,学⽣表为从表,且stu_clazz字段是学⽣表的外键。
通过stu_clazz字段就建⽴了学⽣表和班级表的关系。
【⽰例5】表的外键约束-- 创建⼀个班级表create table class (cno int(4) auto_increment, -- 只有主键才可以⾃增cname varchar(12) not null,room varchar(4),primary key(cno));-- insert into class values (null,'Java001',507);-- insert into class values (null,'Java002',502);-- insert into class values (null,'⼤数据001',401);insert into class values (null,'Java001',507),(null,'Java002',502),(null,'⼤数据001',401);-- 查询数据select * from class-- 创建⼀个学⽣表create table student2(sno int(6) primary key auto_increment,name varchar(12),sex char(1),age int(2),classno int(4),constraint fk_stu2_classno foreign key (classno) references class(cno));desc student2;insert into student2 values(null,'zhangsan','男',23,1);insert into student2 values(null,'lisi','男',24,1);insert into student2 values(null,'wangwu','男',16,2);insert into student2 values(null,'zhaoliu','男',24,4); --delete from class where cno = 1update class set cno = 5 where cno = 2select * from classselect * from student2-- 如果想删除1班,请⼿动的先对1班的学⽣进⾏处理(删除或者清空外键)update student2 set classno = null where classno = 1delete from class where cno = 1-- 希望在更新班级编号的时候,可以直接更新学⽣的班级编号;希望在删除某个班级的时候,清空学⽣的班级编号-- 修改外键设置:外键要修改只能先删除再添加alter table student2 drop foreign key fk_stu2_classno; -- 注意提⽰的问题,其实已经删除了外键alter table student2 add constraint fk_stu2_classno foreign key (classno) references class(cno) on delete set null on update cascade。
数据库中的五种约束

emp_cardid char(18),
constraint pk_emp_id primary key (emp_id),
constraint uk_emp_cardid unique (emp_cardid)
) on [primary]
NOT FOR REPLICATION
指定列的外关键字约束在把从其它表中复制的数据插入到表中时不发生作用。
例7-4:创建一个订货表,与前面创建的产品表相关联
create table orders(
order_id char(8),
p_id char(8),
p_name char(10) ,
p_id char(8) not null,
p_name char(10) not null ,
price money default 0.01 ,
quantity smallint null ,
constraint pk_p_id primary key (p_id, p_name)
5.—-添加外键约束 (主表stuInfo和从表stuMarks建立关系,关联字段stuNo)
alter table stuInfo
add constraint FK_stuNo foreign key(stuNo)references stuinfo(stuNo)
约束(Constraint)是Microsoft SQL Server 提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件(有关数据完整性的介绍请参见第9 章)。在SQL Server 中有5 种约束:主关键字约束(Primary Key Constraint)、外关键字约束(Foreign Key Constraint)、惟一性约束(Unique Constraint)、检查约束(Check Constraint)和缺省约束(Default Constraint)。
sql操作数据库(3)--外键约束、数据库表之间的关系、三大范式、多表查询、事务

sql操作数据库(3)--外键约束、数据库表之间的关系、三⼤范式、多表查询、事务外键约束在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)在已有表中添加外键约束:alter table 从表表名 add constraints 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)删除外键语法: alter table 从表表名 drop foreign key 外键名称;级联操作:注意:在从表中,修改关联主表中不存在的数据,是不合法的在主表中,删除从表中已经存在的主表信息,是不合法的。
直接删除主表(从表中有记录数据关联) 会包删除失败。
概念:在修改或者删除主表的主键时,同时它会更新或者删除从表中的外键值,这种动作我们称之为级联操作。
语法:更新级联 on update cascade 级联更新只能是创建表的时候创建级联关系。
当更新主表中的主键,从表中的外键字段会同步更新。
删除级联 on delete cascade 级联删除当删除主表中的主键时,从表中的含有该字段的记录值会同步删除。
操作:-- 给从表student添加级联操作create table student(s_id int PRIMARY key ,s_name VARCHAR(10) not null,s_c_id int,-- constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)CONSTRAINT stu_cour_id FOREIGN key(s_c_id) REFERENCES course(c_id) -- 给s_c_id 添加外键约束ON UPDATE CASCADE ON DELETE CASCADE)insert into student VALUE(1,'⼩孙',1),(2,'⼩王',2),(3,'⼩刘',4);insert into student VALUE(4,'⼩司马',1),(5,'⼩赵',1),(6,'⼩钱',1);-- 查询学⽣表中的记录select * from student;-- 级联操作。
外键约束(20171015)

外键约束先要理清几个概念:1)候选键(Candidate Key):关系中的一个属性组,其值能唯一标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质了,这样的属性组称作候选键(候选码)。
2)主键(Primary Key):当有多个候选键时,可以选定一个作为主键,选定的候选键称为主键(主码)。
主键唯一标识表中的每行记录。
主键约束有如下特点:每个表中只能有一个主键,主键可以是一列,也可以是多列的组合;主键值必须唯一并且不能为空,对于多列组合的主键,某列值可以重复,但列的组合值必须唯一。
3)外键(Foreign Key):关系R中的一个属性组,它不是R的候选键,但它与另一个关系S 的候选键相对应,则称这个属性组为R的外键(外码)。
关系R称为参照关系(参照表、从表),关系S称为被参照关系(被参照表、主表)。
外键是指一个表(从表)中的一列或列组合,它虽不是该表的主键,但却是另一个表(主表)的主键。
通过外键约束可以为相关联的两个表建立联系,实现数据的引用完整性,维护两表之间数据的一致性关系。
特殊情况下,参照关系和被参照关系可以是同一个关系。
即,特殊情况下,从表和主表可以是同一个表。
参照[引用]关系(Referencing Relation)、子表、从表、外键表、参照[引用]表,这些作为同一术语的同义词使用。
被参照[被引用]关系(Referenced Relation)、父表、主表、主键表、被参照[被引用]表、查找表,这些作为同一术语的同义词使用。
请注意,在英语国家讲数据库的英语文献中,relation有时指“表”,有时指两表之间的联系(relationship)。
指两表之间的relationship时也常用link[链接]。
relationship和relation通常都翻译为关系,但在数据库中两者含义不同。
relationship [关系;联系;关联],在数据库中指不同表之间的数据彼此联系的方法。
sql级联删除语句

sql级联删除语句级联删除是一种在关系型数据库中能够自动删除相关联数据的操作。
当我们在删除关联表的数据时,级联删除会自动删除与之关联的其他表中的数据,从而保持数据的完整性和一致性。
在SQL中,我们可以通过外键约束和级联删除来实现这个功能。
要使用级联删除,首先需要在表之间创建外键约束。
外键约束是一种关系约束,用于确保一个表中的数据与另一个表中的数据是关联的。
外键约束可以在表定义中通过FOREIGN KEY 关键字来创建。
下面是一个示例表的定义:```CREATE TABLE Orders (OrderID int PRIMARY KEY,OrderDate datetime,CustomerID int,FOREIGN KEY (CustomerID) REFERENCESCustomers(CustomerID) ON DELETE CASCADE);```在上面的示例中,Orders表中的CustomerID列是一个外键,它参考了Customers表中的CustomerID列。
在FOREIGN KEY约束中,我们使用了ON DELETE CASCADE子句,它表示在删除Customers表中的一行数据时,将级联删除Orders表中与之关联的数据。
使用级联删除时需要注意以下几点:1. 级联删除只能应用于具有外键约束的表之间的关系。
2. 使用级联删除可能会导致大量的数据库操作,因此它不能滥用。
3. 在进行级联删除操作之前,需要确认相关数据的删除是安全的,以避免意外删除必要的数据。
除了级联删除,还有其他的级联操作,如级联更新。
级联更新可以自动更新在更新主表的数据时更新相关表中所需要更新的数据。
下面是一个示例表的定义,其中包含了外键关系和级联更新:```CREATE TABLE Customers (CustomerID int PRIMARY KEY,CustomerName varchar(255));CREATE TABLE Orders (OrderID int PRIMARY KEY,OrderDate datetime,CustomerID int,FOREIGN KEY (CustomerID) REFERENCESCustomers(CustomerID) ON UPDATE CASCADE);```在上面的示例中,当更新Customers表中的CustomerID列时,将自动更新Orders表中的CustomerID列的相应值。
Oracle 外键约束

Oracle 外键约束外键FOREIGN KEY约束是几种约束是最复杂的,外键约束可以使两个表进行关联。
外键是指引用另一个表中的某个列或某几个列,或者本表中另一个列或另几个列的列。
被引用的列应该具有主键约束,或者惟一性约束。
在外键的定义中,涉及到外键表、外键列、被引用表和被引用列等几个概念。
如果成功地创建了外键约束,那么系统将要求外键列中的数据必须来自被引用列中的数据。
被引用列中不存在的数据不能存储于外键列中。
在一般情况下,当删除被引用表中的数据时,该数据也不能出现在外键列中。
如果外键列存储了将要在被引用表中删除的数据,那么对被引用表删除数据的操作将失败。
最典型的外键约束是HR模式中的EMPLOYEES和DEPARTMENT表,在该外键约束中,外键表EMPLOYEES中的外键列DEMPARTMENT_ID将引用被引用表DEPARTMENTS 中的DEMPARTMENT_ID列。
例如,在以下的示例中,将以HR身份连接到数据库,并创建一个新表ADMINISTRATION_EMP,并为其添加到DEPATRMENT表的外键约束:SQL> connect hr/hr已连接。
SQL> create table administration_emp2 as select * from hr.employees3 where department_id=10;表已创建。
SQL> alter table administration_emp2 add constraint admin_dep_fk3 foreign key(department_id)4references departments(department_id);表已更改。
为验证创建的外键约束的有效性,可以向ADMINISTRATION_EMP表添加一条记录,并且它的DEPARTMENT_ID列值不存在DEPARTMENTS表中,那么插入操作将会因为违反外键约束而失败:SQL> insert into administration_emp(2 employee_id,last_name,email,hire_date,job_id,department_id)3 values(120,'刘丽','li@',sysdate,'HR_REP',360);insert into administration_emp(*第 1 行出现错误:ORA-02291: 违反完整约束条件(HR.ADMIN_DEP_FK) - 未找到父项关键字注意在一个表上创建外键约束时,被引用表必须已经存在,并且必须为该表的引用列定义惟一性约束或主键约束。
外键约束句

外键约束句1. 外键约束啊,就像是守护数据关系的小卫士呢。
比如说,在一个学校的数据库里,学生表和班级表有关系,学生表中的班级编号这个外键,就保证了每个学生都能对应到正确的班级,不会出现一个学生被分到不存在的班级这种混乱情况。
哼,要是没有外键约束,那数据的世界可就乱套喽,就像一群没了领头羊的小羊,到处乱跑。
2. 外键约束,那可是数据库里的大功臣呀。
想象一下,你开了一家连锁超市,有商品表和仓库表。
商品表中的仓库编号外键,就像是一条无形的链子,把商品稳稳地拴在对应的仓库上。
不然的话,商品都不知道自己该待在哪座仓库,这可怎么行呢?这就好比客人去超市找东西,却发现东西到处乱放,那得多糟心啊。
3. 外键约束可不是个简单的玩意儿,它像一个严厉的监工。
拿电商平台举例吧,订单表和用户表之间有联系,订单表中的用户ID外键,时刻监督着订单必须与存在的用户相关联。
要是没有这个约束,就像火车脱了轨,订单可能会关联到一个不存在的用户,那这生意还怎么做呀?哎呀,简直不敢想。
4. 外键约束,就如同在数据海洋里的灯塔。
就说图书馆管理系统吧,图书表和借阅者表相关联,借阅者表中的借阅者ID外键在图书借阅记录里起着关键作用。
它保证每本被借出去的书都能对应到一个真实的借阅者,就像灯塔指引船只一样准确。
要是没有它,图书就像没了方向的船只,不知道被谁借走了,这图书馆还不乱糟糟的?5. 外键约束是数据世界的规矩制定者呢。
例如在一家公司的人事管理数据库里,员工表和部门表是有关联的,员工表中的部门编号外键确保每个员工都隶属于正确的部门。
要是没有这个约束,员工就像散兵游勇,到处乱入部门,那公司的管理还能有序进行吗?这就好比一个乐队没有指挥,各自乱弹乱奏。
6. 外键约束哟,是数据库关系的安全带。
比如说在一个旅游预订系统里,行程表和游客表有联系,行程表中的游客ID外键就像是安全带一样紧紧地系着行程和游客。
如果没有这个外键约束,行程可能会分配给不存在的游客,这就像飞机没有安全带,在飞行过程中随时可能出乱子,多危险呀。
mysql 外键(foreign key)的详解和实例

mysql 外键(foreign key)的详解和实例在MySQL中,外键(foreign key)是用来实现表与表之间关联的一种机制。
外键约束能够保证数据在被插入和更新时的完整性和一致性,大大提高了数据的稳定性和可靠性。
外键的作用是在一个表中创建一个或多个字段,该字段引用另一个表中的主键字段。
可以将外键视为数据表之间的桥梁,将多个表连接在一起,从而形成一个大的逻辑数据模型。
下面是一个关于外键的实例:假设我们有两个数据表:学生表(student)和班级表(class),每个学生都属于一个班级。
学生表中的数据记录包含学生的名字、ID 和班级ID,班级表中的数据记录包括班级的名字和ID。
我们想要实现一个关系:每个学生都有一个班级,且该班级必须在班级表中存在。
为了实现这个关系,需要在学生表中创建一个外键字段,引用班级表中的主键字段。
首先需要在班级表中创建一个主键,例如class_id。
然后,将该主键字段作为外键引用到学生表中,例如student_class_id。
下面是创建班级表的SQL语句:CREATE TABLE class (class_id INT PRIMARY KEY,class_name VARCHAR(50) NOT NULL);然后,创建学生表的SQL语句如下:CREATE TABLE student (student_id INT PRIMARY KEY,student_name VARCHAR(50) NOT NULL,student_class_id INT,FOREIGN KEY (student_class_id) REFERENCES class(class_id) );在上述SQL语句中,创建了一个 student_class_id 字段,并创建了一个外键约束,引用了 class 表中的 class_id 主键。
这保证了每个学生所属的班级必须在班级表中存在。
总的来说,外键使得数据表之间的联系更加紧密,减少了数据不一致的情况。
外键的例子

外键的例子外键是关系数据库中用于建立表与表之间关联关系的一种机制。
它通过在一个表中引用另一个表的主键,来实现表与表之间的连接。
下面是一些以外键为例的具体描述:1. 在一个学校的数据库中,有两个表,一个是学生表,另一个是课程表。
学生表中有一个外键字段,指向课程表中的课程ID字段。
通过这个外键,可以将学生与所选修的课程关联起来。
2. 在一个图书馆的数据库中,有两个表,一个是图书表,另一个是借阅记录表。
借阅记录表中有一个外键字段,指向图书表中的图书ID字段。
通过这个外键,可以将借阅记录与图书关联起来,方便查询借阅情况。
3. 在一个电商网站的数据库中,有两个表,一个是订单表,另一个是商品表。
订单表中有一个外键字段,指向商品表中的商品ID字段。
通过这个外键,可以将订单与商品关联起来,方便查询订单中包含的商品信息。
4. 在一个社交网络的数据库中,有两个表,一个是用户表,另一个是好友关系表。
好友关系表中有两个外键字段,分别指向用户表中的用户ID字段,表示好友关系的两个用户。
通过这两个外键,可以建立用户之间的好友关系。
5. 在一个酒店管理系统的数据库中,有两个表,一个是客房表,另一个是客户表。
客房表中有一个外键字段,指向客户表中的客户ID 字段。
通过这个外键,可以将客房与客户关联起来,方便查询客房的入住情况。
6. 在一个论坛的数据库中,有两个表,一个是帖子表,另一个是评论表。
评论表中有一个外键字段,指向帖子表中的帖子ID字段。
通过这个外键,可以将评论与帖子关联起来,方便查询某个帖子的所有评论。
7. 在一个电影网站的数据库中,有两个表,一个是电影表,另一个是演员表。
演员表中有一个外键字段,指向电影表中的电影ID字段。
通过这个外键,可以将演员与参演的电影关联起来,方便查询某个演员参演的所有电影。
8. 在一个物流系统的数据库中,有两个表,一个是订单表,另一个是物流信息表。
物流信息表中有一个外键字段,指向订单表中的订单ID字段。
SQLServer主键、外键、唯一等约束

SQLServer主键、外键、唯⼀等约束主键(primary key)约束、外键(foreign key)约束、唯⼀(unique)约束、检查(check)约束、默认值(default)约束实例Oracle 有如下类型的约束:NOT NULL(⾮空)、UNIQUE Key(唯⼀约束)、PRIMARY KEY(主键约束)、FOREIGN KEY(外键约束)、CHECK约束Oracle使⽤SYS_Cn格式命名约束.创建约束:在建表的同时创建、建表后创建约束的类型有如下⼏种:C (check constraint on a table)P (primary key)U (unique key)R (Referential AKA Foreign Key)V (with check option, on a view)O (with read only, on a view)1、创建约束CREATE TABLE students(student_id VARCHAR2(10) NOT NULL,student_name VARCHAR2(30) NOT NULL,college_major VARCHAR2(15) NOT NULL,status VARCHAR2(20) NOT NULL,state VARCHAR2(2),license_no VARCHAR2(30)) TABLESPACE student_data;2、创建主键:ALTER TABLE students ADD CONSTRAINT pk_students PRIMARY KEY (student_id)USING INDEX TABLESPACE student_index;Alter table table_name add constrants BID primary key (bookno);ALERT TABLE table_name MODIFY( column1 PRIMARY KEY);3、创建Unique约束:ALTER TABLE students ADD CONSTRAINT uk_students_license UNIQUE (state, license_no)USING INDEX TABLESPACE student_index;4、创建Check约束:定义每⼀记录都要满⾜的条件,条件表达式不允许有:CURRVAL, NEXTVAL, LEVEL, ROWNUM,SYSDATE, UID, USER, USERENV 函数:ALTER TABLE students ADD CONSTRAINT ck_students_st_lic CHECK ((state IS NULL AND license_no IS NULL) OR (state IS NOT NULL AND license_no is NOT NULL));添加check约束(check_1为约束名,dept_salary为字段名 ) alter table emp add constraint check_1 check(dept_salary>0); 5、创建外键约束:ALTER TABLE students ADD CONSTRAINT fk_students_state FOREIGN KEY (state) REFERENCES state_lookup (state);6. 创建不能为空约束 not nullalter table table_name modify(name not null);alter table table_name modify name1 varchar2(20) not null;实例1:⾸先创建学⽣信息表studentinfo和学⽣成绩表testinfo。
SQL:addconstraint方法添加约束

格式:alter table 表名 add constraint 约束名称 check(列名)
例子:alter table ss add constraint pp check(age>20)
4、添加unique约束:
格式:alter table 表名 add constraint 约束名称 unique(列名)
例子:alter table ss add constraint pp unique(sname)
altertable表名addconstraint约束名称foreignkey列名references被引用表的名称列名
SQL:addconstraint方法添加约束
SQL: add constraint 方法添加约束
alter table 表名 add constraint 约束名称 约束类型(列名)
1、添加主键约束:
格式:alter table 表名 add constraint 约束名称 primary key(列名)
例子:alter table ss add constraint pp primary key(sid)
2、添加外键约束:
格式:alter table 表名 add constraint 约束名称 foreign key(列名) references 被引用表的名称(列名)
使用sql语句修改表的主键和外键

使用sql语句修改表的主键和外键
主键约束:一定是非空的,唯一的,即一张表只能设计一个主键约束,但主键约束可以由多个字段构成,称之为联合主键或复合主键。
创建主键约束名称:
SQL> alter table 表名(最好在设置之前,表当中没有数据)
add constraint pk_id primary key(id);
修改主键约束名称:
SQL> alter table表名
rename constraint pk_id to new_pk_id;
外键约束:主表当中字段必须是主表中的主键字段,主从表中相应的字段必须同一数据类型,从表中的外键字段的值必须来自主表相应字段,或NULL;
删除外键约束:
SQL> alter table 表名
disable constraint fk_typeid_alter;
修改表时添加外键约束:
SQL> alter table表名
add constraint fk_typeid_alter foreign key(typeid_new)references typeinfo 删除、添加后即将外键约束修改完成。
mysql外键约束的基本语法结构

MySQL外键约束的基本语法结构概述在关系型数据库中,外键是用来建立表与表之间关系的重要机制之一。
MySQL作为一种常用的关系型数据库管理系统,也支持外键约束。
本文将详细介绍MySQL外键约束的基本语法结构,包括创建外键、修改外键和删除外键。
创建外键创建外键是将两个或多个表之间关系建立起来的过程,通过外键可以实现数据一致性和完整性。
以下是创建外键的基本语法:ALTER TABLE child_tableADD CONSTRAINT fk_nameFOREIGN KEY (child_column)REFERENCES parent_table(parent_column);其中,child_table为子表,child_column为子表中的外键列,fk_name为外键的名称,parent_table为父表,parent_column为父表中子表外键列参照的列。
创建外键的步骤如下: 1. 使用ALTER TABLE语句来修改表结构。
2. 使用ADD CONSTRAINT关键字指定要添加的约束。
3. 使用FOREIGN KEY关键字指定外键列。
4. 使用REFERENCES关键字指定父表和父表列。
修改外键在一些情况下,需要对已经存在的外键进行修改。
MySQL允许对外键进行修改,包括修改外键名称、修改外键列以及修改外键参照的父表和父表列。
以下是修改外键的基本语法:ALTER TABLE child_tableDROP FOREIGN KEY fk_name;ALTER TABLE child_tableADD CONSTRAINT new_fk_nameFOREIGN KEY (new_child_column)REFERENCES new_parent_table(new_parent_column);其中,child_table为子表,fk_name为原有外键的名称,new_fk_name为修改后的外键名称,new_child_column为修改后的子表外键列,new_parent_table为修改后的父表,new_parent_column为修改后父表中子表外键列参照的列。
MySQL外键(foreignkey)使用及说明详解

MySQL外键(foreignkey)使⽤及说明详解外键也称之为外键约束: foreign key外键: 外⾯的键, ⼀张表的⼀个字段(⾮主键)指向另外⼀个表的主键, 那么该字段就称之为外键.外键所在的表称之为⼦表(附表); 外键所指向的主键所在的表称之为⽗表(主表)⼀、增加外键将⼀个表的字段与另外⼀张表的主键进⾏关联(实体与实体之间的联系)增加外键有两种形式⽅案1: 在创建表的时候就增加外键: 在表字段之后使⽤foreign keyforeign key(外键字段) references 主表(主键);alter table 表名 add constraint 外键名 foreign key(外键字段) references ⽗表(主键字段)查看指定的外键名外键增加的基础条件: 外键字段必须与引⽤表(⽗表主键)的数据类型严格保持⼀致⼆、删除外键外键不能被修改,只能先删除后新增.alter table 表名 drop foreign key 外键名;三、外键作⽤外键也称之为外键约束: 主要作⽤在于对数据进⾏约束.约束1: 外键对⼦表的数据写操作约束: (增加和更新): 如果⼦表中插⼊的数据所对应的外键在⽗表不存在: 不能成功.约束2: 外键对⽗表也有数据约束: 当⽗表操作⼀个记录,但是该记录被⼦表所引⽤的时候,那么⽗表的操作将会被限制(更新: 主键和删除)四、外键约束外键约束: 可以通过在建⽴外键的时候, 对外键进⾏约束控制.约束控制有三种模式严格模式: district(默认的)置空模式: set null,对⼦表的限制: 当⽗表删除⼀个被⼦表引⽤的记录的时候,会⾃动的将⼦表中对应的⽗表引⽤(外键)设置成NULL 级联模式: cascade, 级联操作: 当⽗表对⼀个被⼦表引⽤的数据进⾏操作的时候,会⾃动的连带更新⼦表对应的数据.(更新操作)模式设定语法: 在外键增加之后(foreign key(外键字段) references ⽗表(主键)),增加on关键字, 指定操作⽅式和约束模式. ⼀个常⽤的约束模式如下on update cascade -- 级联操作: ⽗表更新,⼦表跟着变on delete set null; -- ⽗表删除, ⼦表置空更新⽗表主键删除⽗表记录外键要增加成功的前提条件1. ⼦表的外键字段的数据类型必须与⽗表的主键的字段类型要⼀致2. 如果想要在⽗表进⾏数据删除的时候, ⼦表对应的模式为置空: set null,前提是⼦表对应的外键字段允许为空3. 如果是在表创建之后增加外键: ⼀定要考虑表中的数据是否满⾜外键条件。
MySql外键约束CASCADE、SETNULL、RESTRICT、NOACTION

MySql外键约束CASCADE、SETNULL、RESTRICT、NOACTION MySQL有两种常⽤的引擎类型:MyISAM和InnoDB。
⽬前只有InnoDB引擎类型⽀持外键约束。
CASCADE
在⽗表上update/delete记录时,同步update/delete掉⼦表的匹配记录
SET NULL
在⽗表上update/delete记录时,将⼦表上匹配记录的列设为null (要注意⼦表的外键列不能为not null)
NO ACTION
如果⼦表中有匹配的记录,则不允许对⽗表对应候选键进⾏update/delete操作
RESTRICT
同no action, 都是⽴即检查外键约束
NULL、RESTRICT、NO ACTION
删除:从表记录不存在时,主表才可以删除。
删除从表,主表不变
更新:从表记录不存在时,主表才可以更新。
更新从表,主表不变
CASCADE
删除:删除主表时⾃动删除从表。
删除从表,主表不变
更新:更新主表时⾃动更新从表。
更新从表,主表不变
SET NULL
删除:删除主表时⾃动更新从表值为NULL。
删除从表,主表不变
更新:更新主表时⾃动更新从表值为NULL。
更新从表,主表不变。
数据库中的五种约束

7.2.6 列约束和表约束
对于数据库来说,约束又分为列约束(Column Constraint)和表约束(Table Constraint)。
列约束作为列定义的一部分只作用于此列本身。表约束作为表定义的一部分,可以作用于
PRIMARY KEY [CLUSTERED | NONCLUSTERED]
(column_name1[, column_name2,…,column_name16])
各参数说明如下:
constraint_name
指定约束的名称约束的名称。在数据库中应是惟一的。如果不指定,则系统会自动生成一个约束名。
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | 来自O ACTION } ] ]
[ NOT FOR REPLICATION ]
各参数说明如下:
REFERENCES
指定要建立关联的表的信息。
ref_table
指定要建立关联的表的名称。
(p_id, p_name)
) on [primary]
2 外关键字约束
外关键字约束定义了表之间的关系。当一个表中的一个列或多个列的组合和其它表中的主关键字定义相同时,就可以将这些列或列的组合定义为外关键字,并设定它适合哪个表中哪些列相关联。这样,当在定义主关键字约束的表中更新列值,时其它表中有与之相关联的外关键字约束的表中的外关键字列也将被相应地做相同的更新。外关键字约束的作用还体现在,当向含有外关键字的表插入数据时,如果与之相关联的表的列中无与插入的外关键字列值相同的值时,系统会拒绝插入数据。与主关键字相同,不能使用一个定义为 TEXT 或IMAGE 数据类型的列创建外关键字。外关键字最多由16 个列组成。
mysql之外键约束

mysql之外键约束1.什么是外键 A表的主键,在B表中字段出现,就是外键。
2.什么是约束:约束是⼀种限制,它通过对表的⾏货列的数据做出限制,来确保表的数据的完整性、唯⼀性。
⽐如⼈员表中有⼀列是部门id,当新增⼀个⼈员的时候,我们不需要⼿动的在部门id字段给这个⼈员设置⼀个部门,⽽是新增则个新⼈员记录的时候默认就会有⼀个部门id给了这个⼈员,这就是约束。
3.以上1和2结合⼀起就是外键约束。
即:foreign key4.具体操作4.1创建表时,同时创建外键约束4.2已创建表后,追加外键约束(1)添加外键⽅法-- CONSTRAINT 就是创建外键约束 fk_id是外键约束的名字-- foreign key (dept_id) references dept(did)意思是设置person表中的dept_id字段和dept表中的did字段关联,dept表中的did字段就是person表中的dept_id的外键约束,这个外键约束的名字叫做fk_id,⼀般潜规则外键约束的名字开头是fk_ alter table person add CONSTRAINT fk_id foreign key (dept_id) REFERENCES dept(did);此时可以发现在person表中的,点击外键按钮,可以看到创建出来的外键栏位表⽰的是person表中的dept_id字段,参考栏位的did就是person表中的dept_id字段的约束,dept_id字段的值被约束为dept字段did字段的值主表就是外键约束有约束值的那个表从表就是被约束的那个表(2)外键约束的4种类型,RESTRICT、NO ACTION、CASCADE、SET NULL主要针对于外键⾥的删除时和更新时RESTRICT(约束):如果出现在删除时,意思是约束外键主键did记录(主表中的记录)不能直接删除,必须先删除被约束的表(从表)字段中dept_id所有这个外键主键值对应的记录,才能删除外键约束(主表中的记录)NO ACTION:CASCADE:删除选择这个时,删除主表中的记录时,主表中的这个主键id关联的从表的这个id值所在的记录也会被删除。
MySQL外键设置的方法实例

MySQL外键设置的⽅法实例⼀、外键设置⽅法1、在MySQL中,为了把2个表关联起来,会⽤到2个重要的功能:外键(FOREIGN KEY)和连接(JOIN)。
外键需要在创建表的阶段定义,连接可以通过相同意义的字段把2个表连接起来,⽤在查询阶段。
2、假设有2个表,分别是表A和表B,它们通过⼀个公共字段id 发⽣关联关系,我们把这个关联关系叫做R。
如果id在表A中是主键,那么表A就是这个关系R中的主表,相应的,表B就是这个关系中的从表,表B中的id,就是表B⽤来引⽤表A中数据的,叫外键。
所以,外键就是从表中⽤来引⽤主表中数据的那个公共字段。
创建主表CREATE TABLE demo.importhead (listnumber INT PRIMARY KEY,supplierid INT,stocknumber INT,importtype INT,importquantity DECIMAL(10 , 3 ),importvalue DECIMAL(10 , 2 ),recorder INT,recordingdate DATETIME);创建从表CREATE TABLE demo.importdetails(listnumber INT,itemnumber INT,quantity DECIMAL(10,3),importprice DECIMAL(10,2),importvalue DECIMAL(10,2), -- 定义外键约束,指出外键字段和参照的主表字段CONSTRAINT fk_importdetails_importheadFOREIGN KEY (listnumber) REFERENCES importhead (listnumber));运⾏这个SQL语句,我们就在创建表的同时定义了⼀个名字叫fk_importdetails_importhead的外键约束,同时,我们声明,这个外键约束的字段listnumber引⽤的是表importhead⾥⾯的字段listnumber。
外键约束 举例

(1)基本介绍外键作用:使两张表形成关联,外键只能引用外表中的指定列的值!建立外键的前提:本表的列必须与外键类型相同(外键必须是外表的主键)。
指定外键关键字:foreign key(列名)引用外键关键字:references <外键表名>(外键列名)事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action例如:outTable表主键id 类型int创建含有外键的表:create table temp(id int,name char(20),foreign key(id) references outTable(id) on delete cascade on update cascade);说明:把id列设为外键参照外表outTable的id列当外键的值删除本表中对应的列筛除当外键的值改变本表中对应的列值改变。
(2)定义数据表假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息。
用来保存整机产品信息的表叫做pc;用来保存配件供货信息的表叫做parts。
Pc表在pc 表中有一个字段,用来描述这款电脑所使用的CPU型号;在parts 表中相应有一个字段,描述的正是CPU的型号,我们可以把它想成是全部CPU的型号列表。
很显然,这个厂家生产的电脑,其使用的cpu 一定是供货信息表(parts)中存在的型号。
这时,两个表中就存在一种约束关系(constraint)—— pc 表中的cpu 型号受到parts 表中型号的约束。
首先我们来创建parts 表:Create TABLE parts (... 字段定义...,model V ARCHAR(20) NOT NULL,... 字段定义...);接下来是pc 表:Create TABLE pc (... 字段定义...,cpumodel V ARCHAR(20) NOT NULL,... 字段定义...};(3)设置索引若要设置外键,在参照表(referencing table,即pc表) 和被参照表(referenced table,即parts表) 中,相对应的两个字段必须都设置索引(index),也可以设置为候选键(key),因为在很多情况下索引(index)和候选键(key)的功能等同。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1)基本介绍
外键作用:使两张表形成关联,外键只能引用外表中的指定列的值!
建立外键的前提:本表的列必须与外键类型相同(外键必须是外表的主键)。
指定外键关键字:foreign key(列名)
引用外键关键字:references <外键表名>(外键列名)
事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action
例如:
outTable表主键id 类型int
创建含有外键的表:
create table temp(
id int,
name char(20),
foreign key(id) references outTable(id) on delete cascade on update cascade);
说明:把id列设为外键参照外表outTable的id列当外键的值删除本表中对应的列筛除当外键的值改变本表中对应的列值改变。
(2)定义数据表
假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息。
用来保存整机产品信息的表叫做pc;用来保存配件供货信息的表叫做parts。
Pc表
在pc 表中有一个字段,用来描述这款电脑所使用的CPU型号;
在parts 表中相应有一个字段,描述的正是CPU的型号,我们可以把它想成是全部CPU的型号列表。
很显然,这个厂家生产的电脑,其使用的cpu 一定是供货信息表(parts)中存在的型号。
这时,两个表中就存在一种约束关系(constraint)—— pc 表中的cpu 型号受到parts 表中型号的约束。
首先我们来创建parts 表:
Create TABLE parts (
... 字段定义...,
model V ARCHAR(20) NOT NULL,
... 字段定义...
);
接下来是pc 表:
Create TABLE pc (
... 字段定义...,
cpumodel V ARCHAR(20) NOT NULL,
... 字段定义...
};
(3)设置索引
若要设置外键,在参照表(referencing table,即pc表) 和被参照表(referenced table,即parts表) 中,相对应的两个字段必须都设置索引(index),也可以设置为候选键(key),因为在很多情况下索引(index)和候选键(key)的功能等同。
对parts表:
Alter TABLE parts ADD INDEX idx_model (model);
这句话的意思是,为parts 表增加一个索引,索引建立在model 字段上,给这个索引起个名字叫idx_model。
对pc表也类似:
Alter TABLE pc ADD INDEX idx_cpumodel (cpumodel);
事实上这两个索引可以在创建表的时候就设置。
这里只是为了突出其必要性。
(4)定义外键
下面为两张表之间建立前面所述的那种“约束”。
因为pc的CPU型号必须参照parts表中的相应型号,所以我们将pc表的cpumodel字段设置为“外键”(FOREIGN KEY),即这个键的参照值来自于其他表。
Alter TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model);
第一行是说要为pc表设置外键,给这个外键起一个名字叫做fk_cpu_model;第二行是说将本表的cpumodel字段设置为外键;第三行是说这个外键受到的约束来自于parts表的model字段。
这样,我们的外键就搞好了!如果我们试着Create一台pc,它所使用的cpu 的型号是parts 表中不存在的,那么MySQL 会禁止这台PC 被Create 出来。
(5)级联操作
一切看起来都挺好的,不是吗?
考虑以下这种情况:
技术人员发现,一个月之前输入到parts 表中的某个系列的cpu (可能有很多款)的型号全都输错了一个字母,现在需要改正。
我们希望的是,当parts 表中那些Referenced Column 有所变化时,相应表中的Referencing Column 也能自动更正。
可以在定义外键的时候,在最后加入这样的关键字:
ON Update CASCADE; 即在主表更新时,子表(们)产生连锁更新动作,似乎有些人喜欢把这个叫“级联”操作。
:)
如果把这语句完整的写出来,就是:
Alter TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model)
ON Update CASCADE;
除了CASCADE 外,还有RESTRICT(禁止主表变更)、SET NULL(子表相应字段设置为空)等操作。