SQL -- foreign key

SQL – foreign key

SQL – foreign key

Table of Contents

  • 父表和子表的行为
  • 父表和子表同步的例子

优点:
保持数据一致性, 完整性
实现一对一或者一对多的关系

对两个表的要求:
必须使用相同的存储引擎 – InnoDB
数字长度, 是否是 unsigned 的属性相同
字符长度可以不同
必须有索引, 没有的话自动创建

foreign key 就是定义了当父表对应的字段发生变化的时候子表的行为

父表和子表的行为

drop table if exists test1;
create table test1 (
id int auto_increment primary key,
name varchar(20) NOT NULL
);

drop table if exists test2;
create table test2 (       # error 150, 错误 类型不同
id2 smallint primary key auto_increment,
name2 varchar(10) not null,
foreign key (id2) references test1 (id)
);
drop table if exists test2;
create table test2 (
id2 int auto_increment primary key,
name2 varchar(10) not null,
foreign key (id2) references test1 (id)
);

父表: test1
子表: test2

foreign key 默认: 父表和子表的行为

on update / on delete -—

cascade 从父表删除或者更新且 自动删除或者更新子表 中匹配的行
set null 从父表删除或者更新行, 并设置子表中的外键列为 NULL
restrict 拒绝对父表的删除或者更新操作
no action 标准 sql 关键字, 和 restrict (mysql 特有) 相同 (是默认值)
create table test3 (
id3 int primary key auto_increment,
name3 varchar(10) not null,
foreign key (id3) references test1 (id) on delete cascade on update cascade
);

父表和子表同步的例子

准备

drop table if exists test1;
drop table if exists test2;

create table test1 (
id int NOT NULL primary key,
sex enum(‘f‘, ‘m‘)
);

create table test2 (
id int not null,
name varchar(10),
foreign key (id) references test1(id) on delete cascade on update cascade
);
insert into test1 (id, sex) values (1, ‘f‘), (2, ‘m‘), (3, ‘f‘);

select * from test1;
| id | sex  |
+----+------+
|  1 | f    |
|  2 | m    |
|  3 | f    |
select * from test2;

Empty set (0.00 sec)

insert into test2 (id, name) values
(1, ‘abc‘), (1, ‘def‘), (1, ‘xyz‘),
(2, ‘ghi‘), (2, ‘jkl‘), (2, ‘opq‘),
(3, ‘lmn‘), (3, ‘uvw‘), (3, ‘rst‘);

select * from test2;
| id | name |
+----+------+
|  1 | abc  |
|  1 | def  |
|  1 | xyz  |
|  2 | ghi  |
|  2 | jkl  |
|  2 | opq  |
|  3 | lmn  |
|  3 | uvw  |
|  3 | rst  |
delete from test1 where id=1;

select * from test2;
| id | name |
+----+------+
|  2 | ghi  |
|  2 | jkl  |
|  2 | opq  |
|  3 | lmn  |
|  3 | uvw  |
|  3 | rst  |
drop table test1, test2;
时间: 2025-01-12 03:50:55

SQL -- foreign key的相关文章

SQL FOREIGN KEY 约束

SQL FOREIGN KEY 约束 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY. 让我们通过一个例子来解释外键.请看下面两个表: "Persons" 表: Id_P LastName FirstName Address City 1 Adams John Oxford Street London 2 Bush George Fifth Avenue New York 3 Carter Thomas Changan Street Beijing &qu

SQL PRIMARY KEY 约束\SQL FOREIGN KEY 约束\SQL CHECK 约束

SQL PRIMARY KEY 约束 PRIMARY KEY 约束唯一标识数据库表中的每条记录. 主键必须包含唯一的值. 主键列不能包含 NULL 值. 每个表都应该有一个主键,并且每个表只能有一个主键. SQL PRIMARY KEY Constraint on CREATE TABLE 下面的 SQL 在 "Persons" 表创建时在 "Id_P" 列创建 PRIMARY KEY 约束: MySQL: CREATE TABLE Persons ( Id_P i

SQL高级应用--约束二--(PRIMARY KEY、FOREIGN KEY)

四.SQL PRIMARY KEY 约束 PRIMARY KEY 约束唯一标识数据库表中的每条记录 主键必须包含唯一的值 主键列不能包含 NULL 值 每个表都应该有一个主键,并且每个表只能有一个主键 下面的SQL 在 Persons 表创建时在 Id_P列创建PRIMARY KEY 约束 MySQL CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255),

sql数据库删除表的外键约束(INSERT 语句与 FOREIGN KEY 约束"XXX"冲突。该冲突发生于数据库"XXX",表"XXX", column 'XXX)

使用如下SQL语句查询出表中外键约束名称: 1 select name 2 from sys.foreign_key_columns f join sys.objects o on f.constraint_object_id=o.object_id 3 where f.parent_object_id=object_id('表名') 执行如下SQL语句删除即可. 1 alter table 表名 drop constraint 外键约束名 sql数据库删除表的外键约束(INSERT 语句与 F

SQL高级应用--约束(NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK、DEFAULT)

一.SQL约束 约束用于限制加入标的数据的类型 可以在创建表的时候规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE语句) 主要探讨以下的几种约束: 1) NOT NULL 2) UNIQUE 3) PRIMARY KEY 4) FOREIGN KEY 5) CHECK 6) DEFAULT 二.SQL NOT NULL 约束 NOT NULL约束强制列不接受 NULL值 NOT NULL约束强制字段始终包含值.这意味着,如果不向字段添加值,就

SQL - Create Foreign Key Relationships

/* To create a foreign key in a new table */ CREATE TABLE Sales.TempSalesReason ( TempID int NOT NULL, Name nvarchar(50), CONSTRAINT PK_TempSales PRIMARY KEY NONCLUSTERED (TempID), CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID) REFERENCES S

mysql执行带外键的sql文件时出现mysql ERROR 1215 (HY000): Cannot add foreign key constraint的解决

ERROR 1215 (HY000): Cannot add foreign key constraint 最近在建表时遇到了这个错误,然后找了下找到了解决办法,记录下: 本来是要建两张表: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 create table department( id int, name varchar(20) ); create table employee( id int primary key auto_increment, name varch

ERROR 1452 : Cannot add or update a child row: a foreign key constraint fails

MySQL添加外键失败  error 1452解决办法 举例: 两个表       用户表:user   班级表:  grade 用户表中每个用户对应一个班级ID,即gradeId 即:user表的主关键字gradeId是grade表中的Id user表称为主表   grade表称为从表 [sql] alter table user add foreign key (gradeId) references grade(Id ); [error] [原因] user表中的有的gradeId不属于g

postgresql----数据库表约束----FOREIGN KEY

六.FOREIGN KEY ---- 外键约束 外键可以是单个字段,也可以是多个字段.所谓的外键约束就是引用字段必须在被引用字段中存在,除非引用字段部分为NULL或全部为NULL(由MATCH TYPE决定),否则INSERT或UPDATE时将返回失败,且被引用字段必须有唯一约束或是主键. 外键约束语法相对较复杂一点,创建外键的语法如下: ALTER TABLE tbl_foreign CONSTRAINT fk_constraint FOREIGN KEY(col1,col2) REFEREN