MySQL———外键

众所周知:主键和适当的索引对于数据库表来说是必不可少的,但是外键却要尽量避免使用。

矛盾焦点:数据库设计是否需要外键。

这里有两个问题:
一个是如何保证数据库数据的完整性和一致性;
二是外键对性能的影响。

正方观点:

1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。
eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢?
2,有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。
3,外键在一定程度上说明的业务逻辑,会使设计周到具体全面。

反方观点:

1,可以用触发器或应用程序保证数据的完整性
2,过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题
3,不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert, update, delete 数据的时候更快)
eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不 止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在3个小时做完,如果加上外键,需要28个小时!

结论:

1、在大型系统中(性能要求不高,安全要求高),使用外键;
在大型系统中(性能要求高,安全自己控制), 不用外键;
小系统随便,最好用外键。
2、用外键要适当,不能过分追求

注意:

MySQL允许使用外键,但是为了完整性检验的目的,在除了InnoDB表类型之外的所有表类型中都忽略了这个功能。这可能有些怪异,实际上却非常正常:对于数据库的所有外键的每次插入、更新和删除后,进行完整性检查是一个耗费时间和资源的过程,它可能影响性能,特别是当处理复杂的或者是缠绕的连接树时。因而,用户可以在表的基础上,选择适合于特定需求的最好结合。所以,如果需要更好的性能,并且不需要完整性检查,可以选择使用MyISAM表类型,如果想要在MySQL中根据参照完整性来建立表并且希望在此基础上保持良好的性能,最好选择表结构为innoDB类型

### MySQL 的创建与使用方法 #### 什么是 是一种用于维护表之间关系的约束条件。它通常存在于子表中,指向父表的一列或多列(通常是主)。通过设置,可以确保数据一致性和完整性[^1]。 #### 创建带有的表 在的设计过程中需要注意几个关点:首先是确保两张表均采用了支持的存储引擎——InnoDB;其次是明确指定所关联的具体字段及其对应的关系类型[^1]。 ##### 方法一:在建表时直接定义 这是最常见的做法,在新建子表的同时即声明其对部某张表的依赖性。 ```sql CREATE TABLE parent_table ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), UNIQUE (name) ) ENGINE=InnoDB; CREATE TABLE child_table ( id INT AUTO_INCREMENT PRIMARY KEY, parent_name VARCHAR(50), FOREIGN KEY (parent_name) REFERENCES parent_table(name) ON DELETE CASCADE ) ENGINE=InnoDB; ``` 在此案例里,`child_table.parent_name` 列被设为了一个,它引用自 `parent_table.name` 这个唯一索引列。同时设置了级联删除操作 (`ON DELETE CASCADE`) ,意味着一旦某个父记录被移除,则所有相关联的孩子记录也会随之消失[^2]。 ##### 方法二:向已有的表添加 有时候可能需要对现有的数据库架构做出修改,这时候可以通过 ALTER TABLE 来实现这一目标。 ```sql ALTER TABLE child_table ADD CONSTRAINT fk_parent_child FOREIGN KEY (parent_name) REFERENCES parent_table(name); ``` 此命令的作用是在名为 `child_table` 的现有表上追加一个新的限制,该限制同样连接到 `parent_table.name` 上面[^2]。 #### 删除 如果不再希望维持特定的联系或者打算重构整个数据库模型的话,那么就需要知道怎样安全有效地去除掉那些不必要的绑定。 ```sql ALTER TABLE child_table DROP FOREIGN KEY fk_parent_child; ``` 这里展示了如何去掉之前提到过的那个叫作 `fk_parent_child` 的链接[^3]。 #### 关于字符集的支持 考虑到实际应用环境下的复杂需求,比如要储存包含汉字在内的多种语言文字资料的时候,就应该特别留意选用合适的字符编码方案。推荐的做法就是在初始化各个涉及文本处理功能的新表之时就预先指派好恰当的标准配置,像下面这样: ```sql CREATE TABLE sample_table( content TEXT ) DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE=InnoDB; ``` 如此这般便能有效规避因字符集不匹配而导致的各种潜在麻烦事啦! #### 特殊情况提醒 值得注意的是,并非所有的MySQL版本对于都有完全相同的解析行为。例如较新的MySQL版本可能会更加严格地执行某些规则,因此建议开发者们始终查阅官方文档获取最新最权威的信息来源[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-乾坤-

????????????????????????

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值