当前位置:   article > 正文

Mysql数据库 8.SQL语言 外键约束_sql数据库创建外键约束

sql数据库创建外键约束

一、外键约束

外键约束——将一个列添加外键约束与另一张表的主键(唯一列)进行关联之后,这个外键约束的列添加的数据必须要在关联的主键字段中存在

案例

创建原则:先创建不含外键的表也就是班级表

添加外键的方式 

一般使用第一种,第二种主要用于修改已创建的表为副表,当约束再添加时,也应起名字。

constraint 自定义关键字约束名 foreign key(字段名) references 表名(字段名);

constraint FK_STUDENTS_CLASSES foreign key(cid) references classes(class_id)

代码实现: 

  1. #使用数据库
  2. use fine;
  3. #展示数据库
  4. show databases;
  5. #展示当前数据库所有表
  6. show tables;
  7. #创建数据库
  8. create database db_test1;
  9. #使用新建数据库
  10. use db_test1;
  11. #显示数据库中某表
  12. desc classes ;
  13. #先创建不包含外键的表
  14. create table classes(
  15. class_id int(20) primary key auto_increment,#自增操作
  16. class_name varchar(40) not null unique,
  17. class_remark varchar(200)
  18. );
  19. #添加外键表方式一
  20. #创建对应关联的学员表 包含外键
  21. create table students(
  22. stu_num char(8) primary key,#主键约束
  23. stu_name varchar(20) not null,#非空约束
  24. stu_gender char(2) not null,#非空约束
  25. stu_age int not null,#不为空
  26. cid int not null unique,#约束符合实际
  27. constraint FK_STUDENTS_CLASSES foreign key(cid) references classes(class_id)
  28. );
  29. #删除表
  30. drop table students ;
  31. drop table classes ;
  32. #已经创建好表如何进行修改
  33. #添加外键表方式二 创建表再修改
  34. #创建对应关联的学员表
  35. create table students(
  36. stu_num char(8) primary key,#主键约束
  37. stu_name varchar(20) not null,#非空约束
  38. stu_gender char(2) not null,#非空约束
  39. stu_age int not null,#不为空
  40. cid int not null unique
  41. #要与另一表中的主键类型对应
  42. );
  43. #修改表数据,添加约束,具体的约束名称,关联的表和关联的属性
  44. alter table students add constraint
  45. FK_STUDENTS_CLASSES foreign key(cid)
  46. references classes(class_id);
  47. #添加班级数据
  48. insert into classes(class_name,class_remark) values('Java2201','.......');
  49. insert into classes(class_name,class_remark) values('Java2202','.......');
  50. insert into classes(class_name,class_remark) values('Java2203','.......');
  51. insert into classes(class_name,class_remark) values('Java2204','.......');
  52. insert into classes(class_name,class_remark) values('Java2205','.......');
  53. insert into classes(class_name,class_remark) values('C++2206','.......');
  54. #添加学员数据
  55. insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
  56. values('20220101','张三','男',20,1);
  57. insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
  58. values('20220102','李四','女',19,2);
  59. insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
  60. values('20220103','王五','男',21,3);
  61. insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
  62. values('20220104','赵六','女',22,5);
  63. #class表映射于students表中,共有两种方式,可以在创建时约定外键,也可以先创建在修改

二、外键约束——级联

与其他表进行关联了的数据,不能进行修改和删除操作

如何修改与其他表关联了的表数据?

1.将引用了表字段的学生记录中的关联字段修改为NULL;

2.在修改班级信息表中课程信息的id编号

3.在表中关联字段设置为NULL的记录的数据关联字段重新修改为引用字段的新id

代码实现

显示某表

select * from 表名;

显示students表

select * from students s ;

显示班级表

select * from classes c ;

修改操作

update 表名 set 修改的字段 = 修改为 where 限制条件;

  1. update classes set class_id = 7 where class_name ='C++2206';
  2. update classes set class_name = 'Java2206' where class_name ='C++2206';
  3. update classes set class_id = 6 where class_name ='Java2206';

如何修改与其他表关联了的表数据?

——分为三步

  1. #1.先取消此条数据的主外键关系,让外键的id值=null
  2. update students set cid=null where cid = 3;
  3. #2.再更改classes表中曾经引用的班级数据id=7
  4. update classes set class_id =7 where class_name = 'Java2206';
  5. #3.再重新让students表中的数据cid进行外键引用新的id值7
  6. update students set cid=7 where stu_num =20220104;

一步实现:用级联操作实现

  1. #级联操作
  2. #删除students表的外键约束
  3. alter table students drop foreign key FK_STUDENTS_CLASSES;
  4. #重新给students表添加外键约束,但是同时要设置级联的修改和删除
  5. alter table students add constraint FK_STUDENTS_CLASSES
  6. foreign key(cid) references classes(class_id)
  7. on update cascade on delete cascade;#添加级联操作,修改/删除一张表时,另一张表会同时修改
  8. #级联关系改变时,另一条与他关联的数据也会进行改变
  9. update classes set class_id=3 where class_name ='Java2203';
  10. #删除一关联的表
  11. delete from classes where class_id=1;

级联操作:指的是先去删除原有的外键,再去添加外键,并设置级联关系

再去修改/删除时,关联的两条数据同时操作

实现过程

  1. #使用数据库
  2. use fine;
  3. #展示数据库
  4. show databases;
  5. #展示当前数据库所有表
  6. show tables;
  7. #创建数据库
  8. create database db_test1;
  9. #使用新建数据库
  10. use db_test1;
  11. #显示数据库中某表
  12. desc classes ;
  13. #1.先创建不包含外键的表
  14. create table classes(
  15. class_id int(20) primary key auto_increment,#自增操作
  16. class_name varchar(40) not null unique,
  17. class_remark varchar(200)
  18. );
  19. #2.添加外键表方式一
  20. #创建对应关联的学员表 包含外键
  21. create table students(
  22. stu_num char(8) primary key,#主键约束
  23. stu_name varchar(20) not null,#非空约束
  24. stu_gender char(2) not null,#非空约束
  25. stu_age int not null,#不为空
  26. cid int not null unique,#约束符合实际
  27. constraint FK_STUDENTS_CLASSES foreign key(cid) references classes(class_id)
  28. );
  29. #删除表
  30. drop table students ;
  31. drop table classes ;
  32. #1.先创建不包含外键的表
  33. create table classes(
  34. class_id int(20) primary key auto_increment,#自增操作
  35. class_name varchar(40) not null unique,
  36. class_remark varchar(200)
  37. );
  38. #3.已经创建好表如何进行修改
  39. #添加外键表方式二 创建表再修改
  40. #创建对应关联的学员表
  41. create table students(
  42. stu_num char(8) primary key,#主键约束
  43. stu_name varchar(20) not null,#非空约束
  44. stu_gender char(2) not null,#非空约束
  45. stu_age int not null,#不为空
  46. cid int
  47. #要与另一表中的主键类型对应
  48. );
  49. #修改表数据,添加约束,具体的约束名称,关联的表和关联的属性
  50. alter table students add constraint
  51. FK_STUDENTS_CLASSES foreign key(cid)
  52. references classes(class_id);
  53. #添加班级数据
  54. insert into classes(class_name,class_remark) values('Java2201','.......');
  55. insert into classes(class_name,class_remark) values('Java2202','.......');
  56. insert into classes(class_name,class_remark) values('Java2203','.......');
  57. insert into classes(class_name,class_remark) values('Java2204','.......');
  58. insert into classes(class_name,class_remark) values('Java2205','.......');
  59. insert into classes(class_name,class_remark) values('C++2206','.......');
  60. #添加学员数据
  61. insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
  62. values('20220101','张三','男',20,1);
  63. insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
  64. values('20220102','李四','女',19,2);
  65. insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
  66. values('20220103','王五','男',21,3);
  67. insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
  68. values('20220104','赵六','女',22,3);
  69. #class表映射于students表中,共有两种方式,可以在创建时约定外键,也可以先创建在修改
  70. #外键约束————级联
  71. #简单理解:当前两表中关联的数据如要修改需要同步操作
  72. select * from students s ;
  73. select * from classes c ;
  74. #修改操作
  75. update classes set class_id = 7 where class_name ='C++2206';
  76. update classes set class_name = 'Java2206' where class_name ='C++2206';
  77. update classes set class_id = 6 where class_name ='Java2206';
  78. #关联了的数据,不能进行修改和删除操作
  79. #1.先取消此条数据的主外键关系,让外键的id值=null
  80. update students set cid=null where cid = 3;
  81. #2.再更改classes表中曾经引用的班级数据id=7
  82. update classes set class_id =7 where class_name = 'Java2206';
  83. #3.再重新让students表中的数据cid进行外键引用新的id值7
  84. update students set cid=7 where stu_num =20220104;
  85. #级联操作
  86. #删除students表的外键约束
  87. alter table students drop foreign key FK_STUDENTS_CLASSES;
  88. #重新给students表添加外键约束,但是同时要设置级联的修改和删除
  89. alter table students add constraint FK_STUDENTS_CLASSES
  90. foreign key(cid) references classes(class_id)
  91. on update cascade on delete cascade;#添加级联操作,修改/删除一张表时,另一张表会同时修改
  92. #级联关系改变时,另一条与他关联的数据也会进行改变,将班级名为Java2203的班级,班级序号改为3
  93. update classes set class_id=3 where class_name ='Java2203';
  94. #删除一关联的class_id=1的表;
  95. delete from classes where class_id=1;

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/497399
推荐阅读
相关标签
  

闽ICP备14008679号