精华内容
下载资源
问答
  • MySQL数据库主键和外键详解

    千次阅读 2020-03-20 20:15:42
    MySQL数据库主键和外键详解 主键 主键的定义 主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义 ...

    MySQL数据库的主键和外键详解

    主键

    主键的定义

    主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。

    作用:

    1)保证实体的完整性;

    2)加快数据库的操作速度

    3)在表中添加新记录时,DBMS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。

    4)DBMS自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。

    联合主键

    关系数据库实际上还允许通过多个字段唯一标识记录,即两个或更多的字段都设置为主键,这种主键被称为联合主键。

    对于联合主键,允许一列有重复,只要不是所有主键列都重复即可。

    主键的特性

    主键的必要性

    在有些数据库中,虽然主键不是必需的,但最好为每个表都设置一个主键,不管是单主键还是复合主键。它存在代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,以及本记录的修改与删除。

    主键的无意义性

    由于主键的作用十分重要,如何选取主键会对业务开发产生重要影响。如果我们以学生的身份证号作为主键,似乎能唯一定位记录。然而,身份证号也是一种业务场景,如果身份证号升位了,或者需要变更,作为主键,不得不修改的时候,就会对业务产生严重影响。

    选取主键的一个基本原则是:不使用任何业务相关的字段作为主键。

    因此,身份证号、手机号、邮箱地址这些看上去可以唯一的字段,均不可用作主键。

    主键的选择

    • 自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键;
    • 全局唯一GUID类型:使用一种全局唯一的字符串作为主键,类似8f55d96b-8acc-4636-8cb8-76bf8abc2f57。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法,可以自己预算出主键。

    对于大部分应用来说,通常自增类型的主键就能满足需求

    定义的自增性整数类型的主键一般使用是BIGINT NOT NULL AUTO_INCREMENT类型。

    如果使用INT自增类型,那么当一张表的记录数超过2147483647(约21亿)时,会达到上限而出错。使用BIGINT自增类型则可以最多约922亿亿条记录。

    外键

    外键的定义

    如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。

    举例:

    student表:
    在这里插入图片描述
    class表:
    在这里插入图片描述
    由于一个班级可以有多个学生,在关系模型中,这两个表的关系可以称为“一对多”,即一个class的记录可以对应多个student表的记录。

    为了表达这种一对多的关系,我们需要在student表中加入一列class_id,让它的值与class表的某条记录相对应。

    这样,我们就可以根据class_id这个列直接定位出一个student表的记录应该对应到class的哪条记录。

    student表中,通过class_id的字段,可以把数据与另一张表关联起来,这种列称为外键

    外键并不是通过列名实现的,而是通过定义外键约束实现的:

    //定义外键约束
    ALTER TABLE student
    ADD CONSTRAINT fk_class_id  //外键约束的名称fk_class_id可以任意
    FOREIGN KEY (class_id)     //指定了class_id作为外键
    REFERENCES class (id);    //指定了这个外键将关联到class表的id列(即class表的主键)
    

    class_id为学生表的外键。(此时student表中的class_id与class表中的id表示的含义相同)

    此时外键表是student表,主键表是class表。

    要删除一个外键约束,也是通过ALTER TABLE实现的:

    ALTER TABLE student
    DROP FOREIGN KEY fk_class_id;
    

    由于外键约束会降低数据库的性能,大部分互联网应用程序为了追求速度,并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性。这种情况下,class_id仅仅是一个普通的列,只是它起到了外键的作用而已。

    选取设置 MySQL 外键的字段

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

    • 父表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
    • 必须为父表定义主键。
    • 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
    • 在父表的表名后面指定列名或列名的组合。这个列或列的组合必须是父表的主键或候选键。
    • 外键中列的数目必须和父表的主键中列的数目相同。
    • 外键中列的数据类型必须和父表主键中对应列的数据类型相同。

    外键的作用

    **保持数据一致性,完整性。**主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值

    外键约束

    MySQL外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列。一个表可以有一个或多个外键。

    外键是表的一个字段,不是本表的主键,但对应另一个表的主键。定义外键后,不允许删除另一个表中具有关联关系的行。

    • 主表(父表)

      对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表。

      被引用的表叫主表(父表)。

    • 从表(子表)

      对于两个具有关联关系的表而言,相关联字段中外键所在的表就是从表。

      定义了外键的表叫从表(子表)。

    外键约束的作用:

    阻止执行

    • 从表插入新行,其外键值不是主表的主键值便阻止插入;
    • 从表修改外键值,新值不是主表的主键值便阻止修改;
    • 主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);
    • 主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。

    级联执行

    • 主表删除行,连带从表的相关行一起删除;
    • 主表修改主键值,连带从表相关行的外键值一起修改。两种方法提供给用户选择。无论选取哪种方法,从表里都不会有多余行。从另一个角度理解,用拒绝同一事物在从表中的标志与主表不一致来实现与主表中的标志一致。

    两种实现方法,通过下面方式选择:

    • 界面:设级联更新、级联删除两个选择方框,选取则级联执行、不选取则阻止执行;
    • 命令:设E)kSCM)E、RESTRICT两个可选项,CASCADE为级联执行、RESTRICT为阻止执行。

    CASCADE:级联删除

    在外键表的最后,加上on delete cascade 就是级联删除

    再删除主表数据时和主表关联的子表数据也会删除

    CREATE TABLE `student` (
      `id` bigint(64) NOT NULL AUTO_INCREMENT,
      `class_id` bigint(64) DEFAULT NULL,
      `name` varchar(32) COLLATE utf8_bin DEFAULT NULL,
      `age` int(32) DEFAULT NULL,
      `sex` varchar(32) COLLATE utf8_bin DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `fk_class_id` (`class_id`),
      CONSTRAINT `fk_class_id` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`)  
        on delete cascade,
    ) 
    

    所谓的级联删除,就是删除主键表的同时,外键表同时删除。

    以上面的例子将就是,假如班级表中的某个班级被删除了,那么在学生表中要想查询这个被删除的班级号所对应的班级信息就会报错,因为已经不存在这个班级了,所以,删除班级表(主键表)时必须删除其他与之关联的表,这里就说明了外键的作用,保持数据的一致性、完整性。当然反过来讲,你删除学生表中的记录,并不影响班级表中的数据,你查询班级号也能正确查询。所以删除外键表中的数据并不影响主键表。

    RESTRICT:约束/限制、NO ACTION(非活动,默认)

    当取值为No Action或者Restrict时,则当在主键表中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除。(即外键表约束主键表)

    SET NULL:级联置空

    在在外键表的最后,加上on delete set null就是级联置空

    再删除主表数据时,会把和主表关联的外键设置成NULL

    CREATE TABLE `student` (
      `id` bigint(64) NOT NULL AUTO_INCREMENT,
      `class_id` bigint(64) DEFAULT NULL,
      `name` varchar(32) COLLATE utf8_bin DEFAULT NULL,
      `age` int(32) DEFAULT NULL,
      `sex` varchar(32) COLLATE utf8_bin DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `fk_class_id` (`class_id`),
      CONSTRAINT `fk_class_id` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`)  
       on  delete  set null,
    ) 
    

    当取值为Set Null时,则当在主键表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null,(一样是外键表约束主键表,不过这就要求该外键允许取null)。

    NO ACTION和RESTRICT的区别:只有在及个别的情况下会导致区别,前者是在其他约束的动作之后执行,后者具有最高的优先权执行。

    注意

    删除表时,应该先删子表,后删父表,除非使用casecade constraints 解除关联。

    先删除父表时会报错:有一个被foreign keys关联的 key的字段在子表中

    <e>查询:drop table class
    
    错误代码: 3730
    Cannot drop table 'class' referenced by a foreign key constraint 'fk_class_id' on table 'student'.
    

    如果一定要先删除父表

    使用casecade constraints解除关联就可以删掉父表

    drop table parent cascade constranints;
    

    在这里插入图片描述

    如有需要的朋友可以关注我的公众号并回复:数据库电子书 ,即可获取以下免费PDF资料
    在这里插入图片描述

    展开全文
  • [导读 ] 使用 MySQL 开发过数据库驱动的小型 web 应用程序的人都知道对关系数据库 的表进行创建 检索更新删除等操作都是些比较简单的过程 理论上 只要掌握了最常 见的 SQL 语句的用法并熟悉您选择使用的服务器端...
  • msyql的主键和外键 概念(很多都是屁话) 1.外键约束 mysql通过外键约束来保证表与表之间的数据完整性和和准确性 外键的使用条件:  1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持...

    msyql的主键和外键

    概念(很多都是屁话)

    1.外键约束

    mysql通过外键约束来保证表与表之间的数据完整性和和准确性

     外键的使用条件:
        1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);
       2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立; 
       3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;
     外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;

    #dage是主键
    CREATE TABLE `dage` ( `id` int(11) NOT NULL auto_increment,
    `name` varchar(32) default '',
    PRIMARY KEY  (`id`))
    ENGINE=InnoDB DEFAULT CHARSET=utf8;

    #xiaodi是外键  :外键 REFERENCES 主键  (外键依赖主键,或外键引用主键,倒8是外键)  先有主键才有外键
    CREATE TABLE `xiaodi` (
     `id` int(11) NOT NULL auto_increment,
     `dage_id` int(11) default NULL,
     `name` varchar(32) default '',
     PRIMARY KEY  (`id`),
     KEY `dage_id` (`dage_id`),
      CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;

    #修改小弟的外键(删掉小弟的外键)
    ALTER TABLE xiaodi drop foreign key xiaodi_ibfk_1;

    #给外键约束增加事件触发限制
    ALTER TABLE xiaodi ADD FOREIGN KEY(dage_id) REFERENCES dage(id) ON DELETE CASCADE ON UPDATE CASCADE;
    #往大哥插入一个数据(之后才能插小弟,因为大哥的是主键,小弟是外键)
    INSERT INTO dage(name) VALUES('铜锣湾');
    #往小弟表插入一个数据(没有大哥前是不可以增加小弟的)
    INSERT INTO xiaodi(dage_id,name) VALUES(2,'铜锣湾小弟0');
    #删除大哥(有了外键约束的事件触发限制) ,可以干掉大哥(小弟自动出局)
    DELETE FROM dage WHERE id =2;#因为ON DELETE CASCADE 

     

    引用:https://www.cnblogs.com/programmer-tlh/p/5782451.html

    展开全文
  • 1.MySQL连接数据库时,因为之前安装过wamp所以用navicat连接mysql一直报错,试了各种方法都没有解决。解决方法:1.卸载wamp(以后用不着的情况下); 2.安装MySql(百度软件可下载),...2.MySql创建外键的问题,保存报...

    1.MySQL连接数据库时,因为之前安装过wamp所以用navicat连接mysql一直报错,试了各种方法都没有解决。

    解决方法:1.卸载wamp(以后用不着的情况下);

                      2.安装MySql(百度软件可下载),安装的时候只需安装Server only项,安装过程中需要自己输入数据库的密码,这个很重要。安装完成点击测试连接就可以了。


    2.MySql创建外键的问题,保存报错(1075)

    解决方法:如果mysql表中含有ID字段,并设为自增量,要将ID设为主键,主键为其他字段的话就会报错。


    3.MySql创建外键时一点保存外键就消失

    解决方法:创建外键的字段字符类型和被连接的字段的字符类型要完全一样,例如:是否勾选“无符号”,还有数据库表的“选项”中的“引擎”也要一样,我就是这两个地方没注意,导致一直创建不了。              

    展开全文
  • 外键必须是另一个表的主键吗? 答: 不一定是主键,但必须是唯一性索引。 主键约束唯一性约束都是唯一性索引。 FOREIGN KEY 约束 外键 (FK) 是用于建立加强两个表数据之间的链接的一列或多列。当创建...
    • 外键必须是另一个表的主键吗? 

    答:

    不一定是主键,但必须是唯一性索引。

    主键约束和唯一性约束都是唯一性索引。

    • FOREIGN KEY 约束 

    外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。当创建或修改表时可通过定义 FOREIGN KEY 约束来创建外键。

    在外键引用中,当一个表的列被引用作为另一个表的主键值的列时,就在两表之间创建了链接。这个列就成为第二个表的外键。

    例如,因为销售订单和销售人员之间存在一种逻辑关系,所以 AdventureWorks 数据库中的 Sales.SalesOrderHeader 表含有一个指向Sales.SalesPerson 表的链接。SalesOrderHeader 表中的 SalesPersonID 列与 SalesPerson 表中的主键列相对应。SalesOrderHeader 表中的SalesPersonID 列是指向 SalesPerson 表的外键。

    SalesOrderHeader.SalesPersonID 为外键。

    FOREIGN KEY 约束并不仅仅可以与另一表的 PRIMARY KEY 约束相链接,它还可以定义为引用另一表的 UNIQUE 约束。FOREIGN KEY 约束可以包含空值,但是,如果任何组合 FOREIGN KEY 约束的列包含空值,则将跳过组成 FOREIGN KEY 约束的所有值的验证。若要确保验证了组合 FOREIGN KEY 约束的所有值,请将所有参与列指定为 NOT NULL。

     

    • 什么是主键、外键:

    关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 
    比如  
    学生表(学号,姓名,性别,班级) 
    其中每个学生的学号是唯一的,学号就是一个主键 
    课程表(课程编号,课程名,学分) 
    其中课程编号是唯一的,课程编号就是一个主键 
    成绩表(学号,课程号,成绩) 
    成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以 学号和课程号的属性组是一个主键 

      
    成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键 
      
    同理 成绩表中的课程号是课程表的外键 
      
    定义主键和外键主要是为了维护关系数据库的完整性,总结一下:
    1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。

    身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。 
    2.外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。

    比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。

     

    • 主键、外键和索引的区别 

     

    主键

    外键

    索引

    定义:

    唯一标识一条记录,不能有重复的,不允许为空

    表的外键是另一表的主键, 外键可以有重复的, 可以是空值

    该字段没有重复值,但可以有一个空值

    作用:

    用来保证数据完整性

    用来和其他表建立联系用的

    是提高查询排序的速度

    个数:

    主键只能有一个

    一个表可以有多个外键

    一个表可以有多个惟一索引

    聚集索引和非聚集索引的区别?

    聚集索引一定是唯一索引。但唯一索引不一定是聚集索引。  

    聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。

     

    • 数据库中主键和外键的设计原则

    主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。

    必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。

    主键:

      关系数据库依赖于主键---它是数据库物理模式的基石。

      主键在物理层面上只有两个用途:

            1. 惟一地标识一行。

            2. 作为一个可以被外键有效引用的对象。

      基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则:

            1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。

            2. 主键应该是单列的,以便提高连接和筛选操作的效率。

            注:使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。

            3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。

           注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。

            4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。

            5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。

     

    • 外键约束的三种情况:

    因为外键和被引用的主键(唯一键)之间构成一种的主从关系;
          被引用的表是主表,存在外键的表是从表;
          当主表中的被引用为外键的数据记录被删除时,会影响从表中的记录(因为从表使用了主表的字段作为了外键)
          产生三种主从表的处理情况:
             默认的; 不允许主表删除被从表引用为外键的记录;
             set null;主表可以删除记录,然后从表把外键字段的值设置为null,
             cascade;主表可以删除记录,同时也删除从表中引用该记录作为外键的所有的记录;

    -----------外键约束的三种情况-------------------
    --------------------------------------------------------------------------------
    --1. 默认的; 不允许主表删除被从表引用为外键的记录;
    --------------------------------------------------------------------------------
    -- 主表,部门表
    create table dept10(dept_id,dept_name,manager_id,location_id)
    as select d.department_id,d.department_name,d.manager_id,d.location_id from departments d;
    
    -- 添加主键约束
    alter table dept10 add constraint dept10_deptId_pk primary key(dept_id);
    
    -- 从表,员工表
    create table emps10 (
           emp_id number(11) not null,
           emp_name nvarchar2(50),       
           manager_id number(11),
           dept_id number(11),       
           --- 表级约束
           constraint emps10_empId_pk primary key(emp_id),
           constraint emps10_deptId_fk foreign key(dept_id) 
                                   references dept10(dept_id)  -- 外键的默认约束     
    );
    
    --- 插入数据
    insert into emps10(emp_id,emp_name,manager_id,dept_id)
           select e.employee_id,e.first_name || ' '||e.last_name,e.manager_id,e.department_id 
           from employees e where e.department_id in (select dept_id from dept10);
    -- 提交事务
    commit;
    
    --- 不允许删除主表中作为外键的记录
    delete from dept10 where dept_id = 60;
    
    
    
    
    
    
    --------------------------------------------------------------------------------
    --2. set null;主表可以删除记录,然后从表把外键字段的值设置为null
    --------------------------------------------------------------------------------
    -- 主表,部门表
    create table dept20(dept_id,dept_name,manager_id,location_id)
    as select d.department_id,d.department_name,d.manager_id,d.location_id from departments d;
    
    -- 添加主键约束
    alter table dept20 add constraint dept20_deptId_pk primary key(dept_id);
    
    -- 从表,员工表
    create table emps20 (
           emp_id number(11) not null,
           emp_name nvarchar2(50),       
           manager_id number(11),
           dept_id number(11),       
           --- 表级约束
           constraint emps20_empId_pk primary key(emp_id),
           constraint emps20_deptId_fk foreign key(dept_id) 
                      references dept20(dept_id)  on delete  set null  -- 外键的set null约束     
    );
    
    --- 插入数据
    insert into emps20(emp_id,emp_name,manager_id,dept_id)
           select e.employee_id,e.first_name || ' '||e.last_name,e.manager_id,e.department_id 
           from employees e where e.department_id in (select dept_id from dept20);
    -- 提交事务
    commit;
    
    --- 查询数据
    select * from dept20;
    select * from emps20;
    
    --- 删除主表中作为外键的记录,从表中的外键会设置为null值
    delete from dept20 where dept_id = 60;
    
    
    
    
    
    
    -----------------------------------------------------------------------------------
    --3. cascade;主表可以删除记录,同时也删除从表中引用该记录作为外键的所有的记录;
    ----------------------------------------------------------------------------------
    -- 主表,部门表
    create table dept30(dept_id,dept_name,manager_id,location_id)
    as select d.department_id,d.department_name,d.manager_id,d.location_id from departments d;
    
    -- 添加主键约束
    alter table dept30 add constraint dept30_deptId_pk primary key(dept_id);
    
    -- 从表,员工表
    create table emps30 (
           emp_id number(11) not null,
           emp_name nvarchar2(50),       
           manager_id number(11),
           dept_id number(11),       
           --- 表级约束
           constraint emps30_empId_pk primary key(emp_id),
           constraint emps30_deptId_fk foreign key(dept_id) 
                         references dept30(dept_id)  on delete cascade  -- 外键的cascade约束     
    );
    
    --- 插入数据
    insert into emps30(emp_id,emp_name,manager_id,dept_id)
           select e.employee_id,e.first_name || ' '||e.last_name,e.manager_id,e.department_id 
           from employees e where e.department_id in (select dept_id from dept30);
    -- 提交事务
    commit;
    
    --- 查询数据
    select * from dept30;
    select * from emps30;
    
    --- 删除主表中作为外键的记录,从表中的外键会设置为null值
    delete from dept30 where dept_id = 60;
    
    ------------------------------------------------------------------------------------
    -----------外键约束的三种情况-------------------

    参考1:https://blog.csdn.net/haiross/article/details/50435374

    参考2:https://blog.csdn.net/bingqingsuimeng/article/details/51595560

    展开全文
  • 数据库主键和外键定义

    千次阅读 2015-07-07 15:01:24
    主键用于唯一标识表中的行数据,不能为空,一个主键值对应一行数据。...约束内表的数据的更新,从定义外键时可以发现 外键和主键表联系,数据类型要统一,长度(存储大小)要统一。这样在更新数据的时候会保持一致性。
  • SQL SERVER 数据库主键和外键的思考

    千次阅读 2013-10-14 23:12:54
    SQL SERVER 数据库主键和外键的思考 什么是主键: 主键是指表中一个列或者列的组合,其值能够唯一的标识表中的每一个行。这样的一列或者多列成为表的主键,通过它可以强制表的实体完整性。当创建或者更改表时...
  • 需要按照要求给表创建主键、创建索引,创建外键(并设置删除更新规则) 一、创建主键 ​ 自己创建一个数据库和最少两个表(student表 course 表),然后上图:点击创建主键 [外链图片转存失败,源站可能有防盗...
  • 定义主键主要是为了维护关系数据库的完整性。2、外键外键用于与另一张表的关联,是能确定另一张表记录的字段。外键是另一个表的主键,可以重复,可以有多个,也可以是空值。定义外键主要是为了保持数据的一致性。3...
  • # 创建数据库studyhe create database studyhe charset=utf8; # 查看当前使用的数据库 SELECT database(); # 使用studyhe数据库 use studyhe; # 显示studyhe数据库下所有表 show tables; # 创建学生...
  • 以前创建数据库时就是有主键创建主键,但是表之间的关系没有联系,要建数据库关系图只有主键没有外键时不行的。 建外键的前提是此外键必须是另外一个表的主键。建外键的步骤: 第一步打开要建外键表的设计器...
  • 定义主键主要是为了维护关系数据库的完整性。2、外键外键用于与另一张表的关联,是能确定另一张表记录的字段。外键是另一个表的主键,可以重复,可以有多个,也可以是空值。定义外键主要是为了保持数据的一致性。3...
  • 创建主键外键和约束

    千次阅读 2009-03-11 14:01:00
    关系数据库的数据必须遵循的约束实体完整性:所有主属性均不可取空值,不仅仅是主码不可为空参照完整性:外键或者是空值,或者必须作为引用表的主键值而存在。用户自定义完整性一个表只能有一个主键!!!多于一个可...
  • 创建数据库:create database 数据库名; 删除数据库:drop database 数据库名; 单行注释–注释内容 多行注释:/内容/ mysql数据类型 1.1数值型:int tinyint微整型 smallint 小整型 1.2小数类型:decimal(总位数,...
  • 2.在初始化 数据库表中设置 create table 系部 ( 系部代码 char(6) primary key not null, 系部名称 varchar(30) not null, 系主任 char(8)  ) create table 专业表 ( 专业代码 char(4) primary key not null, ...
  • Markdown扩展Markdown简洁的语法 代码块高亮 图片链接图片上传 LaTex数学公式 UML序列图流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl
  • 使用主键和外键的“多对多”数据库关系。 该项目的目标是为一个通用的国际非政府组织创建一个完整的全栈项目的初始后端。 我们选择了亚洲,并将该非政府组织指定为亚洲非政府组织(ANGO)。 前端分为两个部分,即...
  • 当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。 作用: 1...
  • sql主键和外键的区别

    千次阅读 2015-10-13 23:56:20
    当创建或者更改表时可以通过定义PRIMARY KEY约束来创建主键,一个表只能有一个主键约束,而且主键约束中的列不能是空值,由于主键约束确保唯一数据,所一经常来定义标识列。 每一个表都必须定义一个主键吗? 我个人...
  • mysql 创建 表 sql语句 带主键和外键

    万次阅读 2010-08-26 11:01:00
    从这个模型中可以看出,文中示例用到三张数据库表分别为 customers,orders orderdetails。其中 customers 表的 customernumber 字段作为外键出现在 orders 表中,而 orders 表的 ordernumber 字段做为外键出现在...
  • 表的主键外键创建外键

    千次阅读 2014-09-14 22:11:03
    在现实世界中,除了事物本身的信息外,事物之间还存在着很多联系,这种联系反映到数据库中就体现为表之间的联系。例如在图1中,学生表存储学生信息,系表存储系的信息。但学生表系表之间是有联系的:每个学生都...
  • 关于MySQL列表主键外键的定义关联 首先我们需要通过cmd创建两个表单,以下为创建的具体步骤。(创建表单之前先通过cmd登录MySQL账号并选择数据库哦!) 1.1(创建表单) 以上第一行代码为创建一个名为emp2的表单...
  • 接下来完整数据库表的设计,对表设置主键,表与表的外键,唯一...1)对各个表创建主键约束; MYSQL>ALTERTABLEDEPARTMENTADDCONTRAINTPRIMARYKEY(DEPARTMENT_NAME); MYSQL>DESCDEPARTMENT; MYSQL>ALTERT...
  • mysql约束,主键,外键

    2020-09-29 19:07:21
    数据库表约束:对表中的数据进行限制,保证数据的正确性、有效性完整性,一个表如果添加了约束,不正确的数据将无法插入到表中。约束在创建表的时候添加比较合适。 约束名 约束关键字 主键 primary key ...
  • 本人上课提问,问什么是主键,什么是外键。本来觉得意会的东西,...如何用sql创建一个主键和一个外键?如何删除一个主键?(针对有auto_increment会有所不同)如何对有外键的表添加数据?和删除数据?1.主键的定义...
  • 数据库为什么需要外键

    千次阅读 2019-08-15 11:00:33
    外键:指定一个字段或字段组合作为一个外键(即外来的主键或唯一键),该外键和另一个表的主键或唯一键(MySQL不支持,Oracle支持)建立起一个关系,只能定义为表级约束。 使用条件: 1、两个表存储引擎必须是InnoDB...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,018
精华内容 407
关键字:

数据库创建主键和外键