`
liqita
  • 浏览: 291895 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MySql外键设置详解

阅读更多
MySql外键设置详解
(1) 外键的使用:

外键的作用,主要有两个:
    一个是让数据库自己通过外键来保证数据的完整性和一致性
    一个就是能够增加ER图的可读性
    有些人认为外键的建立会给开发时操作数据库带来很大的麻烦.因为数据库有时候会由于没有通过外键的检测而使得开发人员删除,插入操作失败.他们觉得这样很麻烦
其实这正式外键在强制你保证数据的完整性和一致性.这是好事儿.
    例如:
    有一个基础数据表,用来记录商品的所有信息。其他表都保存商品ID。查询时需要连表来查询商品的名称。单据1的商品表中有商品ID字段,单据2的商品表中也有商品ID字段。如果不使用外键的话,当单据1,2都使用了商品ID=3的商品时,如果删除商品表中ID=3的对应记录后,再查看单据1,2的时候就会查不到商品的名称。
   当表很少的时候,有人认为可以在程序实现的时候来通过写脚本来保证数据的完整性和一致性。也就是在删除商品的操作的时候去检测单据1,2中是否已经使用了商品ID为3的商品。但是当你写完脚本之后系统有增加了一个单据3 ,他也保存商品ID找个字段。如果不用外键,你还是会出现查不到商品名称的情况。你总不能每增加一个使用商品ID的字段的单据时就回去修改你检测商品是否被使用的脚本吧,同时,引入外键会使速度和性能下降。


(2) 添加外键的格式:
ALTER TABLE yourtablename
    ADD [CONSTRAINT 外键名] FOREIGN KEY [id] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name, ...)
    [ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
    [ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
说明:
on delete/on update,用于定义delete,update操作.以下是update,delete操作的各种约束类型:
CASCADE:
外键表中外键字段值会被更新,或所在的列会被删除.
RESTRICT:
RESTRICT也相当于no action,即不进行任何操作.即,拒绝父表update外键关联列,delete记录.
set null:
被父面的外键关联字段被update ,delete时,子表的外键列被设置为null.
而对于insert,子表的外键列输入的值,只能是父表外键关联列已有的值.否则出错.

外键定义服从下列情况:(前提条件)
1)
所有tables必须是InnoDB型,它们不能是临时表.因为在MySQL中只有InnoDB类型的表才支持外键.
2)
所有要建立外键的字段必须建立索引.
3)
对于非InnoDB表,FOREIGN KEY子句会被忽略掉。
注意:
创建外键时,定义外键名时,不能加引号.
如: constraint 'fk_1' 或 constraint "fk_1"是错误的

(3) 查看外键:
SHOW CREATE TABLE ***;可以查看到新建的表的代码以及其存储引擎.也就可以看到外键的设置.
删除外键:
alter table drop foreign key '外键名'.
注意:
只有在定义外键时,用constraint 外键名 foreign key .... 方便进行外键的删除.
若不定义,则可以:
先输入:alter table drop foreign key -->会提示出错.此时出错信息中,会显示foreign key的系统默认外键名.--->
用它去删除外键.

(4) 举例


实例一:
4.1
CREATE TABLE parent(id INT NOT NULL,
                    PRIMARY KEY (id)
) TYPE=INNODB;                      -- type=innodb 相当于 engine=innodb
CREATE TABLE child(id INT, parent_id INT,
                   INDEX par_ind (parent_id),
                   FOREIGN KEY (parent_id) REFERENCES parent(id)
                     ON DELETE CASCADE
) TYPE=INNODB;
向parent插入数据后,向child插入数据,插入时,child中的parent_id的值只能是parent中有的数据,否则插入不成功;
删除parent记录时,child中的相应记录也会被删除;-->因为: on delete cascade
更新parent记录时,不给更新;-->因为没定义,默认采用restrict.
4.2
若child如下:
mysql>
create table child(id int not null primary key auto_increment,parent_id int,
index par_ind (parent_id),
constraint fk_1 foreign key (parent_id) references
parent(id) on update cascade on delete restrict)
type=innodb;
用上面的:
1).
则可以更新parent记录时,child中的相应记录也会被更新;-->因为: on update cascade
2).
不能是子表操作,影响父表.只能是父表影响子表.
3).
删除外键:
alter table child drop foreign key fk_1;
添加外键:
alter table child add constraint fk_1 foreign key (parent_id) references
parent(id) on update restrict on delete set null;

(5) 多个外键存在:

product_order表对其它两个表有外键。
一个外键引用一个product表中的双列索引。另一个引用在customer表中的单行索引:
CREATE TABLE product (category INT NOT NULL, id INT NOT NULL,
                      price DECIMAL,
                      PRIMARY KEY(category, id)) TYPE=INNODB;
CREATE TABLE customer (id INT NOT NULL,
                      PRIMARY KEY (id)) TYPE=INNODB;

CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,
                      product_category INT NOT NULL,
                      product_id INT NOT NULL,
                      customer_id INT NOT NULL,
                      PRIMARY KEY(no),
                      -- 双外键
                      INDEX (product_category, product_id),
                      FOREIGN KEY (product_category, product_id)
                        REFERENCES product(category, id)
                        ON UPDATE CASCADE ON DELETE RESTRICT,
                      -- 单外键
                      INDEX (customer_id),
                      FOREIGN KEY (customer_id)

                       REFERENCES customer(id)) TYPE=INNODB;

(6) 说明:

1.若不声明on update/delete,则默认是采用restrict方式.
2.对于外键约束,最好是采用: ON UPDATE CASCADE ON DELETE RESTRICT 的方式.



来自: http://hi.baidu.com/shanghaocool/blog/item/1d014b0bf4afdc89d1581bbc.html
分享到:
评论

相关推荐

    MySQL命令行&MySql外键设置详解 .txt

    MySQL命令行&MySql外键设置详解 .txt

    mysql外键设置

    ### MySQL 外键设置详解 #### 一、MySQL 外键的作用及意义 在数据库设计中,外键(Foreign Key)是一种重要的约束机制,用于确保数据表之间的引用完整性。通过设置外键,可以保证主表中的某列或某些列与从表中的...

    mysql外键的设置方法

    ### MySQL外键设置详解 #### 一、外键的基本概念 在关系型数据库设计中,外键(Foreign Key)是一种非常重要的约束机制,用于确保数据的一致性和完整性。通过定义外键,可以实现不同表之间的关联,从而确保引用的...

    MySQL外键使用详解

    MySQL外键是数据库设计中一个重要的概念,用于在两个表之间建立关联,确保数据的一致性和完整性。在MySQL中,外键主要用于实现参照完整性,它允许一个表中的字段引用另一个表中的主键,从而实现两个表之间的逻辑联系...

    MySQL数据库中的外键约束详解.doc

    MySQL数据库中的外键约束详解.doc

    MySQL外键使用及说明详解

    MySQL通过外键约束来保证表与表之间的数据的完整性和准确性。 外键的使用条件:  1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);  2.外键列必须建立了索引,...

    MySQL外键详解

    ### MySQL外键详解 #### 一、外键的基本概念与作用 外键(Foreign Key)是一种重要的数据库约束机制,主要用于确保数据库中多个表之间数据的一致性和完整性。它通过引用另一个表的主键来实现这一目标。外键的存在...

    MySQL外键.docx

    ### MySQL外键详解 #### 一、外键概念与作用 **外键(Foreign Key)** 是数据库设计中用于确保数据完整性和关联性的一种机制。它通过定义一个表中的列或列组合,来引用另一个表的主键或唯一键,以此来建立两个表...

    深入mysql外键关联问题的详解

    MySQL外键关联是数据库设计中的一个重要特性,它用于在两个表之间建立引用完整性约束,以确保数据的一致性和准确性。本文通过深入分析MySQL中外键关联问题,旨在帮助读者理解并掌握外键的创建、修改以及删除等操作的...

    详解MySQL 外键约束

    外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立; 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而...

    MySQL创建数据表并建立主外键关系详解

    在MySQL中,创建数据表并设置主外键关系需遵循以下规则: 1. 存储引擎必须是InnoDB,因为MyISAM引擎不支持外键约束。 2. 外键列和参照列的数据类型应相同或可隐式转换,以确保数据一致性。 3. 外键列必须有索引,...

    mysql外键基本功能与用法详解

    因此,为了实现外键功能,应确保表的存储引擎设置为InnoDB。 外键的修改和删除比较特殊,外键本身的信息不能直接修改,需要先删除再重新创建。删除外键的命令是`ALTER TABLE 表名 DROP FOREIGN KEY 外键名`。需要...

Global site tag (gtag.js) - Google Analytics