外键

外键的使用,跟他的优缺点

廉价感情. 提交于 2019-12-22 20:39:18
转自:http://www.cnblogs.com/fuland/p/4280434.html 主键和索引是不可少的,不仅可以优化数据检索速度,开发人员还省不其它的工作, 矛盾焦点:数据库设计是否需要外键。这里有两个问题:一个是如何保证数据库数据的完整性和一致性;二是第一条对性能的影响。 正方观点: 1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。 eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢? 2,有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。 3,外键在一定程度上说明的业务逻辑,会使设计周到具体全面。 反方观点: 1,可以用触发器或应用程序保证数据的完整性 2,过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题 3,不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert, update, delete 数据的时候更快) eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候

Cannot add or update a child row: a foreign key constraint fails

霸气de小男生 提交于 2019-12-21 23:40:14
Cannot add or update a child row: a foreign key constraint fails 当我们在对表进行外键约束的时候 alter table 表名 add constraint 外键名 foreign key(列)references 表名(主键)on delete 级联操作 MYSQL会报这个错误的原因是 被设置的为外键的列中有和另一个表主键不同的值,导致失败 来源: CSDN 作者: 八戒; 链接: https://blog.csdn.net/weixin_44799092/article/details/103647980

1.SQL数据定义语言(基础)

余生长醉 提交于 2019-12-21 02:07:57
1.创建数据库 CREATE Database database_name; 习惯Sql语句中,保留的关键字否设置为大写,数据库、表、字段为小写。 2.创建数据表 创建数据表基本语法 CREATE TABLE 表名( 列名1 类型 [NOT NULL,UNIQUE,DEFAULT value,PRIMARY KEY,CONSTRAINT foregin_name foregin key(column) references outer_table_name(column) on Delete RESTRICT|CASCADE|SET NULL] ); 说明 1.中括号中的内容为可选项目 2.常用的列数据类型有 INT、SMALLINT、FLOAT、DATE、DATETIME、VARCHAR(n)、CHAR(n)等 3.NOT NULL 设置值不能为NULL、UNIQUE设置值不能重复 4.PRIMARY KEY设置为主键 只有外键可以设置为auto_increment 5.CONSTRAINT外建名 references outer_table_name(列值) on Delete|Update RESTRICT|CASCADE|SET NULL] 设置外键 restrict主表中数据不能删除数据、CASCADE主表中被删除那么引用为外键值对的表格也删除

MySQL中数据表的基本操纵

寵の児 提交于 2019-12-19 09:14:01
本文基于对国家863中部软件孵化器编著的《MySQL从入门到精通》一书的操作实践。 一、创建数据表 数据表属于数据库,在创建数据表之前,应该使用语句 USE 数据库名 指定操作是在那个数据库中进行。 创建数据表的语句为CREATE TABLE ,语法规则如下: 1 CREATE TABLE 表名 2 ( //为括号 3 字段名1 数据类型 [列级别约束条件] [默认值], 4 字段名1 数据类型 [列级别约束条件] [默认值], 5 ...... 6 [表级约束条件] 7 ); //要有分号 使用CREATE TABLE 创建表时,要注意一下几点: (1)要创建表名,不区分大小写,不能使用SQL语言中的关键字,如DROP、ALTER等; (2)数据表中每一个字段的名称和数据类型,如果要创建多个,要用逗号隔开。 1、主键约束 主键,又称主码,是表中一列或者多列的组合。主键约束(Primary Key Constraint)要求主键列的数据唯一,并且不允许为空。主键能够唯一标识表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度。主键和记录之间的关系如同身份证和人之间的关系,它们之间一一对应。主键分为两种类型:单字段主键和多字段联合主键。 (1)单字段主键 a)在定义列的同时指定主键,语法规则如下: 字段名 数据类型 PRIMARY KEY [默认值]

链接查询和分组查询

点点圈 提交于 2019-12-19 07:36:04
分组查询 select 查询信息 from 表名 where 条件 group by 按照列分组(可多个 ,隔开) order by 排序方式 (查询信息如果列名和聚合函数同时出现,要么在聚合函数中出现,要么就使用分组进行查询) having 条件 分组筛选(一般和group by连用,位置在其后) where:用来筛选from子句指定的操作所产生的行 group by:用来分组where子句输出 having:用来从分组的结果中筛选行 1.分组查询是针对表中不同的组分类统计和输出的 2.having子句能够在分组的基础上,再次进行筛选 3.在SQL语句中使用次序,where-->group by-->having 表连接 select 列 from 表1,表2 where 条件(表1.主键列=表2.外键列) 内连接(inner join) select 列 from 表1 inner join 表2 on 条件(表1.主键列=表2.外键列) as也可以为表赋别名 外连接(两外连接主表位置相反) 左外连接(left join) select 列 from 主表 left outer join 从表 on (表1.主键列=表2.外键列) 右外连接(right join) select 列 from 从表 right outer join 主表 on (表1.主键列=表2.外键列)

mysql外键

两盒软妹~` 提交于 2019-12-19 06:29:28
MySQL 外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列。一个表可以有一个或多个外键。 外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键的值必须等于另一个表中主键的某个值。 外键是表的一个字段,不是本表的主键,但对应另一个表的主键。定义外键后,不允许删除另一个表中具有关联关系的行。 外键的主要作用是保持数据的一致性、完整性。例如,部门表 tb_dept 的主键是 id,在员工表 tb_emp5 中有一个键 deptId 与这个 id 关联。 主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表。 从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的表就是从表。 在table2中字段typeid为数据库testdb的表table1的外键,关联其主键id。 constraint设置索引名(外键名)。 来源: https://www.cnblogs.com/1016391912pm/p/12065676.html

SQL语句基本操作

时间秒杀一切 提交于 2019-12-19 04:53:08
库和表级别的操作: 目标 方法 创建utf8编码的数据库 CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 删除数据库 drop database 数据库名称; 删除表 drop table 数据库名称; 显示表的结构字段 desc 表名; 清空表内容 delete from 表名; 显示所有数据 select * from 表名; 进入数据库 use 数据库名 创建表 create table 表名( 列名 类型 是否可以为空,)ENGINE=InnoDB DEFAULT CHARSET=utf8 ENGINE=InnoDB 有事务性或原子操作时要加这个引擎,not null - 不可空 null- 可空 一般情况下这么写就行: 清空表内容时如果想主键从新开始累计 添加外键: alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段); (外键其实就是多个表之间通过每个字段建立的联系,用于控制用户输入) 删除外键: alter table 表名 drop foreign key 外键名称 修改默认值: ALTER TABLE testalter_tbl ALTER i SET

数据库设计的5种常见关系

巧了我就是萌 提交于 2019-12-18 04:00:41
数据库设计的5种常见关系,其中本文主要讲“多态”关系结构,以手机为例。 1,配置关系 --和其他表无任何关系的表。 例如:webConfig里的东西你存储到表里。 2,一对多关系 ,一张表包含另外一个表的主键作为外键。 例如:手机.品牌id=2, 这里的2是[品牌名称表]的id字段为2的纪录,品牌名称是"Nokia"。一个手机只能有一个品牌。 3,多对多,需要3张表,有一个包含两个外键的关系表。 例如: 手机1即属于"智能" 又属于"滑盖"组的, 一个组包含多个手机,一个手机可以属于多个组。 4,树型结构,常见的两钟:父ID设计和001002编码设计。 例如:手机的经销商分为 省/市/县 5,“多态”结构和多对多略有不同,如果需求中某表字段多少类型有非常大的不确定性,可以采用3个表来完成: 一个[主表](ID), 一个[属性名称表](属性ID.属性名称), 一个[属性值表],包括3个字段: 属性值(属性Value varchar(500)) 主表ID 属性ID 这样可以作到最小冗余度。 (和常见的多对多关系不同的是:值统一用varchar来存储,因为这类型的值一般不会用来计算)。 比如:手机型号有几千种,除了共同属性外还有不同属性有几百个,属性名和值类型都不一样,有的手机有这属性,有的没有。 对于这样的“多态”,我们就采用上面的设计结构。 其效果相当于: 某奇怪手机.属性集合[

转:数据库中多对多的关系设计

左心房为你撑大大i 提交于 2019-12-18 03:59:52
转:http://www.cnblogs.com/xuqiang/archive/2010/08/30/1953515.html http://xuqiang.github.io/。 xq.1990.weihai@gmail.com。 数据库设计多对多关系的几种形态 前言:多对多关系至少需要3个表,我们把一个表叫做主表,一个叫做关系表,另外一个叫做字典表或者副表(字典表是纪录比较少,而且基本稳定的,例如:版块名称;副表是内容比较多,内容变化的,例如)。 按照数据库的增删查改操作,多对多关系的查找都可以用inner join或者select * from 主表 where id in (select 主表id from 关系表) 1,角色任命型 特点:关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键,有一个表是字典类型的表。 界面特点:显示主表,用checkbox或多选select设置多选关系。 例如:任命版主(用户表-关系表-版块名称表),角色权限控制等,用户是5个版块版主,只要关系表5行纪录就可以确立,关系表的两个外键具有联合主键性质。 增加关系:如果没有组合纪录,insert之。 删除关系:如果有组合纪录,删除之。 2,集合分组型 特点:同角色任命型类似,关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键。区别是主副表都不是字典表,可能都很大不固定。 界面特点

数据库设计多对多关系的几种形态

醉酒当歌 提交于 2019-12-18 03:58:48
前言:多对多关系至少需要3个表,我们把一个表叫做主表,一个叫做关系表,另外一个叫做字典表或者副表(字典表是纪录比较少,而且基本稳定的,例如:版块名称;副表是内容比较多,内容变化的,例如)。 按照数据库的增删查改操作,多对多关系的查找都可以用inner join或者select * from 主表 where id in (select 主表id from 关系表) 1,角色任命型 特点:关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键,有一个表是字典类型的表。 界面特点:显示主表,用checkbox或多选select设置多选关系。 例如:任命版主(用户表-关系表-版块名称表),角色权限控制等,用户是5个版块版主,只要关系表5行纪录就可以确立,关系表的两个外键具有联合主键性质。 增加关系:如果没有组合纪录,insert之。 删除关系:如果有组合纪录,删除之。 2,集合分组型 特点:同角色任命型类似,关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键。区别是主副表都不是字典表,可能都很大不固定。 界面特点:显示主表,用搜索代替简单的checkbox或多选select,或者一条一条的添加。 例如:歌曲专集(专集表-关系表-歌曲表)。手机分组(分组表-关系表-手机表)。用户圈子(圈子表-关系表-用户表)。文章标签(文章表-关系表-标签表) 增加关系:同版主任命型。