• ADADADADAD

    mysql中的外键有什么用[ mysql数据库 ]

    mysql数据库 时间:2024-11-25 14:55:25 热度:1℃

    作者:文/会员上传 下载docx

    简介:

    在mysql中,外键是用于建立和加强两个表数据之间的链接的一列或多列,它表示一个表中的一个字段被另一个表中的一个字段引用。外键对相关表中的数据造成了限制,使MySQL能够保持参

    以下为本文的正文内容,请查阅,本站为公益性网站,复制本文以及下载DOC文档全部免费。

    在mysql中,外键是用于建立和加强两个表数据之间的链接的一列或多列,它表示一个表中的一个字段被另一个表中的一个字段引用。外键对相关表中的数据造成了限制,使MySQL能够保持参照完整性。

    本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。

    外键是相对主键而来的。

    主键(primary key) 能够唯一标识表中某一行的属性或属性组。一个表只能有一个主键,但可以有多个候选索引。主键常常与外键构成参照完整性约束,防止出现数据不一致。主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。

    外键(foreign key) 是用于建立和加强两个表数据之间的链接的一列或多列。外键表示一个表中的一个字段被另一个表中的一个字段引用。外键对相关表中的数据造成了限制,使MySQL能够保持参照完整性。

    外键约束主要用来维护两个表之间数据的一致性。简言之,表的外键就是另一表的主键,外键将两表联系起来。一般情况下,要删除一张表中的主键必须首先要确保其它表中的没有相同外键(即该表中的主键没有一个外键和它相关联)。

    定义外键时,需要遵守下列规则:

      主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。

      必须为主表定义主键。

      主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。

      在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。

      外键中列的数目必须和主表的主键中列的数目相同。

      外键中列的数据类型必须和主表主键中对应列的数据类型相同。

      创建外键

      MySQL创建外键语法

      以下语法说明了如何在CREATE TABLE语句中的子表中定义外键。

      CONSTRAINTconstraint_nameFOREIGNKEYforeign_key_name(columns)REFERENCESparent_table(columns)ONDELETEactionONUPDATEaction

      下面我们来更详细的查看上面语法:

        CONSTRAINT子句允许您为外键约束定义约束名称。如果省略它,MySQL将自动生成一个名称。

        FOREIGN KEY子句指定子表中引用父表中主键列的列。您可以在FOREIGN KEY子句后放置一个外键名称,或者让MySQL为您创建一个名称。 请注意,MySQL会自动创建一个具有foreign_key_name名称的索引。

        REFERENCES子句指定父表及其子表中列的引用。 在FOREIGN KEYREFERENCES中指定的子表和父表中的列数必须相同。

        ON DELETE子句允许定义当父表中的记录被删除时,子表的记录怎样执行操作。如果省略ON DELETE子句并删除父表中的记录,则MySQL将拒绝删除子表中相关联的数据。此外,MySQL还提供了一些操作,以便您可以使用其他选项,例如ON DELETE CASCADE,当删除父表中的记录时,MySQL可以删除子表中引用父表中记录的记录。 如果您不希望删除子表中的相关记录,请改用ON DELETE SET NULL操作。当父表中的记录被删除时,MySQL会将子表中的外键列值设置为NULL,条件是子表中的外键列必须接受NULL值。 请注意,如果使用ON DELETE NO ACTIONON DELETE RESTRICT操作,MySQL将拒绝删除。

        ON UPDATE子句允许指定在父表中的行更新时,子表中的行会怎样执行操作。当父表中的行被更新时,可以省略ON UPDATE子句让MySQL拒绝对子表中的行的任何更新。 ON UPDATE CASCADE操作允许您执行交叉表更新,并且当更新父表中的行时,ON UPDATE SET NULL操作会将子表中行中的值重置为NULL值。 ON UPDATE NO ACTIONUPDATE RESTRICT操作拒绝任何更新。

        MySQL创建表外键示例

        以下示例创建一个dbdemo数据库和两个表:categoriesproducts。每个类别都有一个或多个产品,每个产品只属于一个类别。 products表中的cat_id字段被定义为具有UPDATE ON CASCADEDELETE ON RESTRICT操作的外键。

        CREATEDATABASEIFNOTEXISTSdbdemo;USEdbdemo;CREATETABLEcategories(cat_idintnotnullauto_incrementprimarykey,cat_namevarchar(255)notnull,cat_descriptiontext)ENGINE=InnoDB;CREATETABLEproducts(prd_idintnotnullauto_incrementprimarykey,prd_namevarchar(355)notnull,prd_pricedecimal,cat_idintnotnull,FOREIGNKEYfk_cat(cat_id)REFERENCEScategories(cat_id)ONUPDATECASCADEONDELETERESTRICT)ENGINE=InnoDB;

        添加外键

        MySQL添加外键语法

        要将外键添加到现有表中,请使用ALTER TABLE语句与上述外键定义语法:

        ALTERtable_nameADDCONSTRAINTconstraint_nameFOREIGNKEYforeign_key_name(columns)REFERENCESparent_table(columns)ONDELETEactionONUPDATEaction;

        MySQL添加外键示例

        现在,我们添加一个名为vendors的新表,并更改products表以包含供应商ID字段:

        USEdbdemo;CREATETABLEvendors(vdr_idintnotnullauto_incrementprimarykey,vdr_namevarchar(255))ENGINE=InnoDB;ALTERTABLEproductsADDCOLUMNvdr_idintnotnullAFTERcat_id;

        要在products表中添加外键,请使用以下语句:

        ALTERTABLEproductsADDFOREIGNKEYfk_vendor(vdr_id)REFERENCESvendors(vdr_id)ONDELETENOACTIONONUPDATECASCADE;

        现在,products表有两个外键,一个是引用categories表,另一个是引用vendors表。

        删除MySQL外键

        您还可以使用ALTER TABLE语句将外键删除,如下语句:

        ALTERTABLEtable_nameDROPFOREIGNKEYconstraint_name;

        在上面的声明中:

          首先,指定要从中删除外键的表名称。

          其次,将约束名称放在DROP FOREIGN KEY子句之后。

          请注意,constraint_name是在创建或添加外键到表时指定的约束的名称。 如果省略它,MySQL会为您生成约束名称。

          要获取生成的表的约束名称,请使用SHOW CREATE TABLE语句,如下所示:

          SHOWCREATETABLEtable_name;

          例如,要查看products表的外键,请使用以下语句:

          SHOWCREATETABLEproducts;

          以下是语句的输出:

          CREATETABLEproducts(prd_idint(11)NOTNULLAUTO_INCREMENT,prd_namevarchar(355)NOTNULL,prd_pricedecimal(10,0)DEFAULTNULL,cat_idint(11)NOTNULL,vdr_idint(11)NOTNULL,PRIMARYKEY(prd_id),KEYfk_cat(cat_id),KEYfk_vendor(vdr_id),CONSTRAINTproducts_ibfk_2FOREIGNKEY(vdr_id)REFERENCESvendors(vdr_id)ONDELETENOACTIONONUPDATECASCADE,CONSTRAINTproducts_ibfk_1FOREIGNKEY(cat_id)REFERENCEScategories(cat_id)ONUPDATECASCADE)ENGINE=InnoDB;

          products表有两个外键约束:products_ibfk_1products_ibfk_2

          可以使用以下语句删除products表的外键:

          ALTERTABLEproductsDROPFOREIGNKEYproducts_ibfk_1;ALTERTABLEproductsDROPFOREIGNKEYproducts_ibfk_2;

          MySQL禁用外键检查

          有时,因为某种原因需要禁用外键检查(例如将CSV文件中的数据导入表中)非常有用。 如果不禁用外键检查,则必须以正确的顺序加载数据,即必须首先将数据加载到父表中,然后再将数据加载导入到子表中,这可能是乏味的。 但是,如果禁用外键检查,则可以按任何顺序加载导入数据。

          除非禁用外键检查,否则不能删除由外键约束引用的表。删除表时,还会删除为表定义的任何约束。

          要禁用外键检查,请使用以下语句:

          SETforeign_key_checks=0;

          当然,可以使用以下语句启用它:

          SETforeign_key_checks=1;

    mysql中的外键有什么用.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: mysql
    ADADAD