精华内容
下载资源
问答
  • Mysql数据库外键约束(foreign key).pdf
  • MySQL数据库外键的相关知识详解本文我们以一个具体的例子来介绍了MySQL数据库外键的相关知识,以及使用外键时的一些相关的注意事项,希望能够对您有所帮助。作者:ljfbest来源:CSDN博客|2011-09-01 10:56 收藏 ...

    MySQL数据库外键的相关知识详解

    本文我们以一个具体的例子来介绍了MySQL数据库外键的相关知识,以及使用外键时的一些相关的注意事项,希望能够对您有所帮助。

    作者:ljfbest 来源:CSDN博客| 2011-09-01 10:56


    MySQL数据库外键的相关知识是本文我们主要要介绍的内容,接下来我们通过一个具体的例子来逐步介绍这些设置。假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息。用来保存整机产品信息的表叫做pc;用来保存配件供货信息的表叫做parts。

    在pc表中有一个字段,用来描述这款电脑所使用的CPU型号;在parts表中相应有一个字段,描述的正是CPU的型号,我们可以把它想成是全部CPU的型号列表。很显然,这个厂家生产的电脑,其使用的CPU一定是供货信息表(parts)中存在的型号。这时,两个表中就存在一种约束关系(constraint)——pc表中的CPU型号受到parts表中型号的约束。

    首先我们来创建parts表:

    CREATE TABLE parts ( ... 字段定义 ..., model VARCHAR(20) NOT NULL, ... 字段定义 ... );

    接下来是PC表:

    CREATE TABLE pc ( ... 字段定义 ..., cpumodel VARCHAR(20) NOT NULL, ... 字段定义 ... };

    设置索引

    若要设置外键,在参照表 (referencing table,即pc表) 和被参照表(referenced table,即parts表)中,相对应的两个字段必须都设置索引(index)。

    对parts表:

    ALTER TABLE parts ADD INDEX idx_model (model);

    这句话的意思是,为parts表增加一个索引,索引建立在model字段上,给这个索引起个名字叫idx_model。

    对pc表也类似:

    ALTER TABLE pc ADD INDEX idx_cpumodel (cpumodel);

    事实上这两个索引可以在创建表的时候就设置。这里只是为了突出其必要性。

    定义外键

    下面为两张表之间建立前面所述的那种“约束”。因为pc的CPU型号必须参照parts表中的相应型号,所以我们将pc表的cpumodel字段设置为“外键”(FOREIGN KEY),即这个键的参照值来自于其他表。

    ALTER TABLE pc ADD CONSTRAINT fk_cpu_model  FOREIGN KEY (cpumodel)  REFERENCES parts(model);

    第一行是说要为pc表设置外键,给这个外键起一个名字叫做fk_cpu_model;第二行是说将本表的cpumodel字段设置为外键;第三行是说这个外键受到的约束来自于parts表的model字段。

    这样,我们的外键就搞好了!如果我们试着CREATE一台pc,它所使用的CPU的型号是parts 表中不存在的,那么MySQL会禁止这台PC被CREATE出来。

    级联操作

    考虑以下这种情况:

    技术人员发现,一个月之前输入到parts表中的某个系列的cpu(可能有很多款)的型号全都输错了一个字母,现在需要改正。我们希望的是,当parts表中那些 Referenced Column 有所变化时,相应表中的 Referencing Column 也能自动更正。

    可以在定义外键的时候,在最后加入这样的关键字:ON UPDATE CASCADE;即在主表更新时,子表(们)产生连锁更新动作,似乎有些人喜欢把这个叫“级联”操作。

    如果把这语句完整的写出来,就是:

    ALTER TABLE pc ADD CONSTRAINT fk_cpu_model  FOREIGN KEY (cpumodel)  REFERENCES parts(model) ON UPDATE CASCADE;

    除了CASCADE外,还有RESTRICT(禁止主表变更)、SET NULL

    补充说明:

    如果需要在主表删除记录时,当子表有对应记录则不允许删除,就加上 ON delete restrict 。完整案例如下:

    两个表,国家和城市,城市中的country_id是外键。

    
     
    1. Create table country(  
    2. country_id smallint unsigned not null auto_increment,  
    3. country varchar(50) not null,  
    4. last_update timestamp not null,  
    5. primary key(country_id)  
    6. )engine=innoDB default charset=utf8;  
    7. Create table city(  
    8. city_id smallint unsigned not null auto_increment,  
    9. city varchar(50) not null,  
    10. country_id smallint unsigned not null,  
    11. last_update timestamp not null default current_timestamp on update curren_timestamp,  
    12. Primary key(city_id),  
    13. key idx_fk_country_id (country_id),  
    14. constraint fk_city_country Foreign Key(country_id) References country(country_id) on DELETE restrict ON update cascade  
    15. )engine=innoDB default charset=utf8

    删除外键

    删除外键定义

    定义外键的时候articles.member_id外键比articles.category_id子句多了一个CONSTRAINT fk_member ?

    这个fk_member就是用来删除外键定义用的,如下所示:

    
     
    1. mysql> ALTER TABLE articles DROP FOREIGN KEY fk_member;  
    2. Query OK, 1 row affected (0.25 sec)  
    3. Records: 1 Duplicates: 0 Warnings: 0 

    这样articles.member_id外键定义就被删除了,但是如果定义时没有指定CONSTRAINT fk_symbol (即外键符号)时该怎么删除呢?别急,没有指定时,MySQL会自己创建一个,可以通过以下命令查看:

    
     
    1. mysql> SHOW CREATE TABLE articles;  
    2. +———-+————————————+  
    3. | Table    | Create Table                       |  
    4. +———-+————————————+  
    5. | articles | CREATE TABLE `articles` (  
    6. `article_id` int(11) unsigned NOT NULL auto_increment,  
    7. `category_id` tinyint(3) unsigned NOT NULL,  
    8. `member_id` int(11) unsigned NOT NULL,  
    9. `title` varchar(255) NOT NULL,  
    10. PRIMARY KEY (`article_id`),  
    11. KEY `category_id` (`category_id`),  
    12. KEY `member_id` (`member_id`),  
    13. CONSTRAINT `articles_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`)  
    14. ENGINE=InnoDB DEFAULT CHARSET=latin1          |  
    15. +———-+————————————+  
    16. 1 row in set (0.01 sec) 

    可以看出articles.category_id的外键符号为articles_ibfk_1,因为就可以执行以下命令删除外键定义:

    
     
    1. mysql> ALTER TABLE articles DROP FOREIGN KEY articles_ibfk_1;  
    2. Query OK, 1 row affected (0.66 sec)  
    3. Records: 1 Duplicates: 0 Warnings: 0 

    关于MySQL数据库外键的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!

    展开全文
  • 查询数据库外键和外键关联的表名

    业务需求:获取指定数据库中所有表的外键以及外键关联的表名

    SELECT
    	O.TABLE_SCHEMA,
    	O.TABLE_NAME,
    	O.COLUMN_NAME,
    	O.REFERENCED_TABLE_SCHEMA,
    	O.REFERENCED_TABLE_NAME,
    	T.CONSTRAINT_TYPE 
    FROM
    	(
    	SELECT
    		K.CONSTRAINT_SCHEMA,
    		K.CONSTRAINT_NAME,
    		K.TABLE_SCHEMA,
    		K.TABLE_NAME,
    		K.COLUMN_NAME,
    		K.REFERENCED_TABLE_SCHEMA,
    		K.REFERENCED_TABLE_NAME,
    		K.REFERENCED_COLUMN_NAME,
    		R.UPDATE_RULE,
    		R.DELETE_RULE,
    		R.UNIQUE_CONSTRAINT_NAME 
    	FROM
    		information_schema.KEY_COLUMN_USAGE K
    		LEFT JOIN information_schema.REFERENTIAL_CONSTRAINTS R ON K.CONSTRAINT_NAME = R.CONSTRAINT_NAME 
    	) AS O
    	INNER JOIN Information_schema.TABLE_CONSTRAINTS T ON O.Table_Name = T.TABLE_NAME 
    	AND o.TABLE_SCHEMA = upper( '{database}' ) 
    	AND T.CONSTRAINT_NAME = O.CONSTRAINT_NAME 
    	AND T.CONSTRAINT_TYPE = 'FOREIGN KEY' 
    WHERE
    	O.CONSTRAINT_SCHEMA != 'mysql' 
    	AND O.CONSTRAINT_SCHEMA != 'sys'
    

    备注

    TABLE_SCHEMA:数据库名
    TABLE_NAME:表名
    COLUMN_NAME:外键所在的列名
    REFERENCED_TABLE_SCHEMA:外键关联的数据库
    REFERENCED_TABLE_NAME:外键关联的表名

    展开全文
  • MySQL数据库外键问题

    2019-04-23 17:12:01
    MySQL的两种存储引擎中,MYISAM不支持外键,InnoDB支持外键,两张表必须都是InnoDB表才可以建立外键。 缺点 外键会影响大型系统的性能,因为外键约束会导致插入删除更新时频繁检验外键约束,对于大型系统,可以把...

    今天面试被问到使用外键会导致什么问题?
    在MySQL的两种存储引擎中,MYISAM不支持外键,InnoDB支持外键,两张表必须都是InnoDB表才可以建立外键。

    缺点

    外键会影响大型系统的性能,因为外键约束会导致插入删除更新时频繁检验外键约束,对于大型系统,可以把外键约束逻辑写在程序中。
    进行删除是要先删除外键关联,才能正常删除。

    对于大型系统,不要使用外键,而中小型系统,使用外键可以使E-R图更有可读行,是业务逻辑操作更简单。

    展开全文
  • MySQL数据库外键使用

    千次阅读 2018-09-14 14:04:20
    --5.1 向goods表里插入任意一条数据 insert into goods (name,cate_id,brand_id,price) values('联想固态硬盘',10,10,1200);... --5.2 添加外键约束 foreign key -- alter table goods add foreign key ...
    --5.1 向goods表里插入任意一条数据
                 insert into goods (name,cate_id,brand_id,price) values('联想固态硬盘',10,10,1200);
    
                --5.2 添加外键约束 foreign key
                -- alter table goods add foreign key (brand_id) references goods_brands(id);
                  alter table goods add foreign key(cate_id) references goods_cates(id);
                  alter table goods add foreign key(brand_id) references goods_brands(id);
    
                -- 失败原因 ,因为'联想固态硬盘'这行的数据不满足外键约束 delete
                -- delete from goods where name="联想固态硬盘";       
                  delete from goods where id=22;
    
                --5.3 创建表的同时设置外键 (注意 goods_cates 和 goods_brands 两个表必须事先存在)
                create table goods(
                    id int primary key auto_increment not null,
                    name varchar(40) default '',
                    price decimal(5,2),
                    cate_id int unsigned,
                    brand_id int unsigned,
                    is_show bit default 1,
                    is_saleoff bit default 0,
                    foreign key(cate_id) references goods_cates(id),
                    foreign key(brand_id) references goods_brands(id)
                );
    
    
                --5.4 如何取消外键约束
                   alter table goods drop foreign key goods_ibfk_1;
                   alter table goods drop foreign key goods_ibfk_2;
    
    
                -- 需要先获取外键约束名称,该名称系统会自动生成,可以通过查看表创建语句来获取名称
                   show create table goods ;
    
                -- 获取名称之后就可以根据名称来删除外键约束
                --alter table goods drop foreign key goods_ibfk_1;
    
                --5.5 涉及外键的面试
                   在目前主流的数据库设计中,越来越少使用到外键约束
                    原因: 会极大的降低表更新的效率
                    如何替代 '通过外键约束实现数据有效性验证'
                    解决思想: 可在数据录入时验证(表示层,ui层),或者在业务层面(python代码)去验证,而不要数据库层面去验证。
    
    展开全文
  • Mysql 数据库外键设置方式

    千次阅读 2015-10-03 14:33:56
    Mysql数据库5.5以后默认的表类型就是INNOB的,默认支持外键设置,现以学生选课表为例说明外键的设置格式。 第一张学生表: create table student (sid int primary key , sname varchar(45) not null, ssex ...
  • MySql数据库外键关联

    2016-08-24 22:21:08
    设置外键关联是可以设置在删除时和在更新时的操作,其中有三个比较重要的。 (1)层叠(级联):cache (2)设为null:set null (3)无动作:no action(1)层叠,当主表删除一条记录,那么从表对应的引用了被...
  • mySql数据库外键约束条件

    千次阅读 2014-05-12 14:42:05
    MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束。 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持); 2.外键列必须建立了索引,...
  • 首先定义主表的主键 选择SQL Server Management Studio目录树中数据库目录下的数据库关系图 在快捷菜单中选择新建数据库关系图选项 进入添加表界面从可用表中选择要添加到关系图中的表 单击添加按钮然后单击关闭 在...
  • mysql设置外键的好处阻止执行 从表插入新行,其外键值不是主表的主键值便阻止插入; 从表修改外键值,新值不是主表的主键值便阻止修改; 主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的...
  • Mysql数据库外键约束(foreign key)

    千次阅读 2017-04-09 21:19:01
    备注: 外键约束中,被约束字段的值必须来自父键的参考字段FR:海涛高软(QQ技术交流群:386476712)
  • 关系型数据库中,表与表之间存在关联,是很常见的,因此也得名关系型数据库。其中,外键是一个重要特性。主从之间存在一对多、多对多的关系。 经常遇到这样的业务需求。删除一条订单时,要删除该条订单相关联的所有...
  • 外键的名字是一个已经存在的一个键值了,这个时候,你应该检查你的数据库以确保外健名字是唯一的,或者你在键名后面加上几个随机的字符以测试是否是这个原因。   4, 其中一个或者两个表是MyISAM引擎的表,...
  • eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不 止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序...
  • MySql数据库主键外键与数据库设计

    千次阅读 2019-05-20 01:38:57
    MySql数据库主键外键与数据库设计
  • 即阻止非法数据的存入,例如A表中的b列是外键,来源是B表的主键b列,此时在向A表存入数据时数据库会自动检查A表的b列的值在B表的b列中是否存在。 方便、简单、直观。 可以设置级联操作,外键来源删除和修改时数据库...
  • 查看外键名称查看数据库外键名字

    千次阅读 2019-10-29 12:46:35
    我们要进行删除外键时,需要知道外键的名字,那么如何查看数据库外键呢?有2种方式查看: 1.过查看表的方式查看外键名字; 2.通过mysql自带的系统表查看外键。 更多精彩请访问本文源地址: ...
  • mysql数据库-外键

    2017-04-24 10:17:05
     所有的外键都必须在innodb表中使用,而mysqlisam表中是无法使用外键的  什么是innodb表,mysqlisam表?  mysqlisam表不支持事务处理,而innodb表支持事务处理,  什么是事务处理?  请看
  • mysql 外键查询(mysql数据库多表联查)2020-07-24 11:51:00共10个回答查看方式主要是通过第三方工具或者是sql语句,主要有以下三种方式1:使用Navicateformysql,打开数据库、查看数据库表、查看设计表、选择外键选项卡,...
  • 数据库外键约束

    2020-05-17 09:00:29
    数据库外键约束 1.RESTRICT(mysql默认):拒绝更新或删除(是拒绝更新还是删除看外键的具体设置)主表被外键引用的列。 2.NO ACTION:同RESTRICT 3.SET NULL:更新或删除主表对应列,会使子表对应列的值变成NULL...
  • MySQL数据库——外键约束

    千次阅读 2019-05-06 16:47:23
    文章目录方案一:单张表方案二:两张表方案三:两张表并添加外键约束 把用户信息及其收货地址保存在数据中 方案一:单张表 创建表 create table user_info( id char(36) primary key, user_name varchar(30) not ...
  • 为什么需要数据库外键

    千次阅读 2019-01-09 15:59:26
    MySQL数据库使用外键条件:两个表存储引擎必须是InnoDB,MyISAM暂时不支持外键外键列必须建立索引,MySQL4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;外键关系的两表的列的...
  • 不过使用数据库外键也是有好处的,就是可以保证数据的一致性,不太可能出现垃圾数据,这几年开发下来,感觉使用Mysql数据库的公司大概率是不太喜欢用外键的,而使用Oracle的公司则相反。个人也是体会了一把外键删...
  • 数据库外键设计

    2018-10-17 13:31:21
    数据库外键设计时,一般会遇到两个问题,无法创建外键,一个是联动删除。 拿班级表(t_class)和学生表(t_student)来说吧,t_class是父表,t_student是子表。t_student表的class_id关联着t_class表的id。 无法创建外键...
  • mysql数据库创建外键

    千次阅读 2019-01-09 17:02:04
    创建外键注意的地方 必须是innodb引擎 注意外键字段类型和另一张表主键字段类型一致否则报“cannot add foreign key constraint“ 创建 create table class(cid int not null auto_increment, caption ...
  • mysql数据库创建外键老是失败? 可能原因: 1、这是建外键的列与要关联的列类型不匹配造成的; 2、一个表用powerdesigner导入的整型长度为11,另一个直接在mysql中建立的表默认整型长度是10; 3、外键...
  • day05-Mysql数据库--外键

    2020-03-01 16:48:07
    Mysql数据库外键 外键: foreign key, 外面的键(键不在自己表中): 如果一张表中有一个字段(非主键)指向另外一张表的主键,那么将该字段称之为外键. 增加外键 外键可以在创建表的时候或者创建表之后增加(但是要考虑数据...
  • mysql数据库_外键

    2016-03-03 17:24:31
    回顾一下存储引擎 innoDB:支持事务,支持外键 myISAM:不支持事务,不支持外键 ...1.去除数据库垃圾数据 2.连带更新 举例: 部门表: department 班级表 :classes 学生表: student department(主表) id name 1

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 99,710
精华内容 39,884
关键字:

mysql数据库外键

mysql 订阅