MySQL数据库 外键,级联, 修改表的操作

1.外键: 用来建立两张表之间的关系
- 一对多
- 多对多
- 一对一

研究表与表之间的关系:
  1.定义一张 员工部门表
    id, name, gender, dep_name, dep_desc

  - 将所有数据存放在一张表中的弊端:
    1.结构不清晰 ---> 不致命
    2.浪费空间 ---> 不致命
    3.可扩展性极差 ---> 不可忽视的弊端
      - 类似于将所有python代码存放在一个py文件中,强耦合到一起了----> 解耦合 ----> 拆分表

    - 拆分表解决以上问题.

    - 需要给两张表之间,建立一种强有力的关系, 使用 “外键”

- !!!!! ****** 如何确认表与表之间的关系是 (一对多、多对多、一对一)
  - 注意: 要确立两张表之间的关系,必须站在两个位置去思考:
    - 站在员工表的位置: 多个员工能否对应一个部门? 能!!!

      - 员工与部门: 多 对 一

        - 员工表单向 多 对 一 部门表

    - 站在部门表的位置: 多个部门能够对应一个员工? 不能!!!

    总结: 凡是单向 多 对 一 的表关系,称之为 一对多 的外键关系。

  - 外键: 语法: foreign key(当前表中建立关系的外键字段) references 被关联表名(id)

- 一对多

# 创建两张表
1.必须先建立被关联表,再建立关联表

# 被关联表:
dep:
  create table dep(
    id int primary key auto_increment,
    dep_name varchar(16),
    dep_desc varchar(255)
  );

# 关联表:
emp:
  create table emp(
    id int primary key auto_increment,
    name varchar(16),
    age int,
    gender enum(‘male‘, ‘female‘, ‘others‘) default ‘male‘,
    dep_id int not null,
    foreign key(dep_id) references dep(id)
  );

注:KEY中MUL代表外键

# 插入数据:
- 1.必须先插入被关联表(dep)的数据,再插入关联表(emp)的数据。

# dep:
            insert into dep(dep_name, dep_desc) values(‘nb_外交部‘, ‘国际形象大使部门‘),
            (‘sb_教学部‘, ‘造程序员部门!!!!‘),
            (‘技术部‘, ‘技术有限部门‘);

        # emp:
            insert into emp(name, age, gender, dep_id)
            values(‘tank‘, 17, ‘male‘, 1),
            (‘jason‘, 70, ‘male‘, 2),
            (‘sean‘, 50, ‘male‘, 2),
            (‘egon‘, 88, ‘male‘, 2),
            (‘owen‘, 95, ‘female‘, 3);

            # 报错,
            insert into emp(name, age, gender, dep_id) values(‘大饼‘, 100, ‘others‘, 999);

-级联更新与级联删除(把关联数据一起变更)

  - on update cascade
  - on delete cascade

-创建表

#被关联表:
    dep2:
        create table dep2(
            id int primary key auto_increment,
            dep_name varchar(16),
            dep_desc varchar(255)
        );
#关联表:
    emp2:
        create table emp2(
            id int primary key auto_increment,
            name varchar(16),
            age int,
            gender enum(‘male‘,‘female‘,‘others‘) default ‘male‘,
            dep_id int not null,
            foreign key(dep_id) references dep2(id)
            on update cascade
            on delete cascade
        );

- 插入数据

#dep:
    insert into dep2(dep_name,dep_desc)values(‘nb_外交部‘,‘国际形象大使部门‘),
(‘sb_教学部‘,‘造程序员部门!!!!‘),(‘技术部‘,‘技术有限部门‘);
#emp:
    insert into emp2(name,age,gender,dep_id)
    values(‘tank‘,17,‘male‘,1),
    (‘jason‘,70,‘male‘,2),
    (‘sean‘,50,‘male‘,2),
    (‘egon‘,88,‘male‘,2),
    (‘owen‘,95,‘female‘,3);

#报错
insert into emp(name,age,gender,dep_id)values(‘大饼‘,100,‘others‘,999);

- 更新数据或删除数据

-更新记录
update dep2 set id=200 where id=1;

-删除记录
delete from dep2 where id=200;

因为级联,关联数据一起变更为200

注意:mysql中没有多对一,只有一对多

- 多对多

也必须站在两张表的位置去思考;

- 错误示范:

#- 创建book表
    create table book(
        id int primary key auto_increment,
        title varchar(20),
        price int,
        book_content varchar(255),
        author_id int,
        foreign key(author_id) references author(id)
        on update cascade
        on delete cascade
        );

#- 创建author表
    create table author(
        id int primary key auto_increment,
        name varchar(16),
        age int,
        book_id int,
        foreign key(book_id) references book(id)
        on update cascade
        on delete cascade
        );

- 问题: 无法知道哪张表是被关联表

- 利用第三张表,为两张表建立“多对多外键关系”。

#-book:
create table book(
    id int primary key auto_increment,
    title varchar(20),
    price int,
    book_content varchar(255)
);
#-auther:
create table author(
    id int primary key auto_increment,
    name varchar(16),
    age int
);
#-book2author:
create table book2author(
    id int primary key auto_increment,
    book_id int,
    author_id int,
    foreign key(book_id) references book(id)
    on update cascade
    on delete cascade,
    foreign key(author_id) references author(id)
    on update cascade
    on delete cascade
);

- 插入数据

#- book
insert into book(title, price, book_content) values
(‘金瓶mei‘, 199, ‘讲述朦胧时光的小故事‘),
(‘python从入门到断气‘, 2000, ‘学习如何一夜秃头‘),
(‘三体‘, 200, ‘跟着大佬进入宇宙奇幻世界‘)
;

 - author
insert into author(name, age) values
(‘egon‘, 68),
(‘jason‘, 88);

- book2author:
insert into book2author(book_id, author_id) values
(1, 1),
(1, 2),
(2, 2),
(3, 1);

# 报错, 插入的数据,book_id, author_id必须存在
insert into book2author(book_id,author_id) values(4, 4);

# 更新或删除
#更新
update book set price =666 where id =1;
update book set id=4 where id=1;
#删除
delete from book where id=4;  (会删除关联表内容)

- 一对一:

- user_info:
  id, name, age, gender, hobby, id_card

- user:
  id , name, age, detail_id(外键)

- detail:
  id, gender, hobby, id_card

user与detail表建立了 一对一的外键 关系。
foreign key 应该建在 使用频率较高的一方。

-创建表

#被关联表
create table customer(
    id int primary key auto_increment,
    name varchar(16),
    media varchar(32)
);
#关联表
create table student(
    id int primary key auto_increment,
    addr varchar(255),
    phone_char(11),
    id_card char(18),

    # 外键必须设置成唯一的
    customer_id int unique,
    forign key(customer_id) references customer(id)
    on update cascade
    on delete cascade
);
    

- 插入数据

insert into customer(name,media) values
(‘hcy‘,‘facebook‘),
(‘zsb1‘,‘ig‘),
(‘zsb2‘,‘vk‘),
(‘hb‘,‘探探‘);

insert into student(addr,phone,id_card,customer_id) values
 (‘上海‘, ‘15214546711‘, ‘440888888888888888‘, 1),
 (‘北京‘, ‘18888888888‘, ‘440777777777777777‘, 2);

  # 报错,一对一,关系必须 一一对应
insert into student(addr, phone, id_card, customer_id) values (‘上海‘, ‘15214546711‘, ‘440888888888888888‘, 1);

- 插入数据:
insert into

修改表的操作

- 语法: 注意: mysql 关键字不区分大小写
1. 修改表名
ALTER TABLE 表名 RENAME 新表名;

2. 增加字段
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…],ADD 字段名 数据类型 [完整性约束条件…]; # 添加到最后一列

ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST; # 添加到第一列

ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; # 添加到某一列之后

3. 删除字段
ALTER TABLE 表名 DROP 字段名;

4. 修改字段
ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]; # 修改数据类型

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…]; # 修改字段名,保留字段类型

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…]; # 修改字段名与字段类型

- 复制表的操作:
复制表结构+记录 (key不会复制: 主键、外键和索引)
mysql> create table new_service select * from service;

只复制表结构
# 将select * from service where 1=2; ---> 不要真实数据,需要表结构
mysql> create table new_customer select * from customer where 1=2;

原文地址:https://www.cnblogs.com/ludingchao/p/12030415.html

时间: 2024-11-06 13:47:17

MySQL数据库 外键,级联, 修改表的操作的相关文章

MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作)

MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作): a.创建2张表 create table userinfo(nid int not null auto_increment primary key, name varchar(10), age int, part_nid int )engine=innodb default charset=utf8; create table part( nid int not null auto_in

第二百八十节,MySQL数据库-外键链表之一对多

MySQL数据库-外键链表之一对多 外键链表之一对多 外键链表:就是a表通过外键连接b表的主键,建立链表关系 一对多:就是b表的某一个字段值对应a表外键里的多个值,前提是a表要与b表链表

【Mysql】外键级联与级联的劣势

在建表的时候时候,可以对于删除delete.修改update设置为级联.用一个例子先说明外键级联级联的概念 假如数据库中本以存在一张usertable如下: 此user表非常简单,id为主键. 下面我将新建一张cascade_test表如下,这里的user_id与usertable的主键id形成参照完整性,并同时建立删除与修改的级联: 如果用SQL语句建立上图的表则如下: CREATE TABLE `test`.`cascade_test` ( `id` INTEGER UNSIGNED NOT

mysql数据库导入导出 查询 修改表记录

mysql数据导入导出: 导入: 把系统的文件的内容,保存到数据库的表里 导入数据的基本格式:mysql> load data infile "文件名" into table 表名 fields terminated by '分隔符' lines terminated by '\n'; 实例:把系统用户信息保存到hydra01库下的userinfo表里 mysql> create table userinfo(name char(20),password char(1),u

mysql数据库--外键的三种关系

主要内容: 如何找出两张表之间的关系 表的三种关系 一.介绍 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 二.重点理解如果找出两张表之间的关系 分析步骤: #1.先站在左表的角度去找 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id) #2.再站在右表的角度去找 是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id)

吃货眼中的sqlalchemy外键和连表查询

前言 使用数据库一个高效的操作是连表查询,一条查询语句能够查询到多个表的数据.在sqlalchem架构下的数据库连表查询更是十分方便.那么如何连表查询?以及数据库外键对连表查询有没有帮助呢?本篇文章就这两个问题简单解释. 建表 俗话说巧妇难为无米之炊,连表查询肯定要有表,有数据库啊.那有没有数据库是你见了垂涎三尺的呢?中国文化博大精深,饮食文化更是璀璨的明珠.我们就以中国菜系为话题,讲一讲好吃的,顺便再说一说外键和连表查询. 鲁菜  山东菜系,而且在明清两代,宫廷御膳是以鲁菜为主,鲁菜味道浓厚,

mysql外键级联更新删除

MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作,包括RESTRICT.NO ACTION.SET NULL和CASCADE.其中RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新:CASCADE表示父表在更新或者删除时,更新或者删除子表对应记录:SET NULL则是表示父表在更新或者删除的时候,子表的对应字段被S

mysql创建外键出错(注意数据库表字段排序)

1.  两个字段的类型或者大小不严格匹配.例如,如果一个是int(10),那么外键也必须设置成int(10),而不是int(11),也不能是tinyint.另外,你还必须确定两个字段是否一个为 signed,而另一个又是unsigned(即:无符号),这两字段必须严格地一致匹配,更多关于signed和unsigned的信息,请参阅:http://www.verysimple.com/blog/?p=57 2. 试图设置外键的字段没有建立起索引,或者不是一个primary key(主键).如果其中

sql server解决无法删除修改拥有外键约束的表或表的记录字段

sql server解决无法删除修改拥有外键约束的表或表的记录字段 问题如下: or 解决步骤: 1.找出该表的所有外键约束 select * from sys.foreign_keys where referenced_object_id=object_id('订单') order by 1 2.删除所有外键约束(注意外键的名字和表的名字分别是哪个!) alter table 订货项目 drop constraint FK__订货项目__订单编号__412EB0B6; 到这就可以把表删掉了~