精华内容
下载资源
问答
  • <p>I want to add a foreign key to phinx Db migration but it's getting an error. <p>I want to use camping_id in the Bids table as a foreign key from the id of the campaigns table. ...
  • 最近几天我做一个模块要给一张表添加外键,总是添加不上,我也是第一次用mysql数据库,最后查询资料得知只有存储引擎为INNODB才能建立外键,而我的存储引擎则是MyISAM,经过努力最终得以成功更改我的默认存储引擎。...

    最近几天我做一个模块要给一张表添加外键,总是添加不上,我也是第一次用mysql数据库,最后查询资料得知只有存储引擎为INNODB才能建立外键,而我的存储引擎则是MyISAM,经过努力最终得以成功更改我的默认存储引擎。下面我分享给大家!

    先来了解下这两种存储引擎

    InnoDB:
    支持事务处理等
    不加锁读取
    支持外键
    支持行锁
    不支持FULLTEXT类型的索引
    不保存表的具体行数,扫描表来计算有多少行
    DELETE 表时,是一行一行的删除
    InnoDB 把数据和索引存放在表空间里面
    跨平台可直接拷贝使用
    InnoDB中必须包含AUTO_INCREMENT类型字段的索引
    表格很难被压缩

    MyISAM:
    不支持事务,回滚将造成不完全回滚,不具有原子性
    不支持外键
    不支持外键
    支持全文搜索
    保存表的具体行数,不带where时,直接返回保存的行数
    DELETE 表时,先drop表,然后重建表
    MyISAM 表被存放在三个文件 。frm 文件存放表格定义。 数据文件是MYD (MYData) 。 索引文件是MYI (MYIndex)引伸
    跨平台很难直接拷贝
    MyISAM中可以使AUTO_INCREMENT类型字段建立联合索引
    表格可以被压缩

    选择:
    因为MyISAM相对简单所以在效率上要优于InnoDB.如果系统读多,写少。对原子性要求低。那么MyISAM最好的选择。且MyISAM恢复速度快。可直接用备份覆盖恢复。
    如果系统读少,写多的时候,尤其是并发写入高的时候。InnoDB就是首选了。
    两种类型都有自己优缺点,选择那个完全要看自己的实际类弄。

    结果:两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。

    首先查看自己的mysql数据库的默认存储引擎

    mysql> show variables like '%storage_engine%';

    如果不是InnoDB,则要将自己的默认存储引擎改为InnoDB。方法如下:

    第一步:看自己的数据库都提供了那些存储引擎

    mysql> show engines;

    看到红框中的内容说明你的数据库支持InnoDB的存储引擎,如果你能翻译后面的内容也就知道问什么只有InnoDB的存储引擎才能建立外键关系。

    第二步:停止mysql服务

    我的电脑→管理→服务→找到mysql并停止

     

    第三步:在自己mysql的安装目录下找到my.ini文件(有时候这个文件隐藏了),所以你要查看,下面是我个人的:

    第四步:打开这个文件找到 [mysqld]

    将 default-storage-engine=MyISAM 更改为 default-storage-engine=INNODB 即可

    第五步:重启服务,再打开数据库查看默认存储引擎

    至此,更改已经完毕,如果你觉着这篇文正对你有帮助,请评论一下吧!

    展开全文
  • 一、外键的定义 ...下面本文将从一个例子出发来阐述使用外键的原因。 如何将某京东用户Ryan的信息及其多个商品邮寄地址保存到数据库中呢? 方案一 用单张表来保存用户信息以及商品邮寄地址,如下所示: c...

    一、外键的定义

    外键
    用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。在从表添加外键约束,用于引用主表中某列的值。比如学生表的专业编号,员工表的部门编号,员工表的工种编号。

    二、为什么要使用外键

    下面本文将从一个例子出发来阐述使用外键的原因。
    如何将某京东用户Ryan的信息及其多个商品邮寄地址保存到数据库中呢?

    方案一
    用单张表来保存用户信息以及商品邮寄地址,如下所示:

    create table user_info(//创建user_info表
        id int(10) primary key,
        user_name varchar(30) not null,
        password varchar(30) not null,
        real_name varchar(8),
        mobile char(11),
        address varchar(150)
    );
    
    //向user_info表中插入若干条数据
    insert into user_info (id,user_name,password,real_name,mobile,address) 
    values (1,'Ryan','123456','张三','18920120206','河南安阳');
    insert into user_info (id,user_name,password,real_name,mobile,address) 
    values (2,'Ryan','123456','李四','18617297545','北京海淀');
    insert into user_info (id,user_name,password,real_name,mobile,address)
    values (3,'Ryan','123456','王五','17694976949','山西大同');
    

    结果如下
    在这里插入图片描述
    由于每个用户可以有多个收货地址,可以看出这种方法创建的表存在较为严重的字段冗余(user_name和password列),而随着该表中的个人信息字段越来越多,则这一问题表现的就越严重,所以不推荐使用。
    为了解决字段冗余的问题我们可以创建两张表,一张用来保存个人信息,另外一张用来保存收货地址。

    方案二
    设计两张表:一张表保存用户信息,一张表保存商品邮寄信息,如下所示:
    表一

    create table user_info(//创建user_info表保存用户信息
        id int(10) primary key,
        user_name varchar(30) not null,
        password varchar(30) not null
    );
    //向user_info表中插入一条数据
    insert into user_info (id,user_name,password) values (1,'Ryan','123456');
    

    结果如下
    在这里插入图片描述

    表二

    create table address(//创建address表保存商品邮寄信息
        id int(10) primary key,
        user_info_id char(36),
        real_name varchar(8) not null,
        mobile char(11) not null,
        address varchar(150) not null
    );
    //向address表中插入若干条数据
    insert into address (id,user_info_id,real_name,mobile,address) 
    values (1,1,'张三','18920120206','河南安阳');
    insert into address (id,user_info_id,real_name,mobile,address) 
    values (2,1,'李四','18617297545','北京海淀');
    insert into address (id,user_info_id,real_name,mobile,address) 
    values (3,1,'王五','17694976949','山西大同');
    

    结果如下
    在这里插入图片描述
    这种方法虽然解决了字段的冗余问题,但由于只是逻辑上的“外键”关系,在插入数据的时候需要靠数据库操作者的自觉性,所以依然无法保证数据完整性,有可能会出现垃圾信息(没有用的信息)。
    如果这里在向address表中添加一条数据,并且该数据没有与之对应的用户信息则这里添加的数据就是没有用的信息。

    insert into address (id,user_info_id,real_name,mobile,address) values (4,6,'XiaoMing','18338970095','China');
    

    在这里插入图片描述
    如果这里如果把user_info表中的数据删除,但此时地址表中数据将不再完整,这些地址没有与之对应的用户。此时addres表中与之前用户对应的收货地址成为了垃圾信息。
    在这里插入图片描述
    在这里插入图片描述
    这里只是逻辑上的“外键”关系,所以还需要手动删除address表中对应的数据。
    显然逻辑上的"外键"关系需要依靠操作者的自觉性,依然无法保证数据的完整性。

    方案三
    只需在address表中添加外键约束即可。如下所示:

    create table address(//创建address表保存商品邮寄信息
        id int(10) primary key,
        user_info_id char(36),
        real_name varchar(8) not null,
        mobile char(11) not null,
        address varchar(150) not null,
        constraint address_user_info_id_fk foreign key(user_info_id) references user_info(id)//添加外键约束
    );
    

    分析:这种方案为user_info_id添加了外键,指向user_info表的主键,该约束起到了保护数据完整性的作用:如果删除的用户信息id已经在address表中使用,则该条数据无法删除;也无法向address表中添加用户id不存在的地址信息。

    三、外键使用时的注意事项

    1、要求在从表设置外键关系;
    2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求;
    3、主表的关联列必须是一个key(一般是主键或唯一);
    4、插入数据时,先插入主表,再插入从表;删除数据时,先删除从表,再删除主表;
    5、可以通过以下两种方式来删除主表的记录:
      方式一:级联删除:ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;
      方式二:级联置空:ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL。

    展开全文
  • 最近工作中用到powerdesigner ,前期需要通过powerdesigner生成表结构,后来由于负责人员不在,很多表结构的添加没有同步到powerdesigner,一个个核对表结构着实麻烦,于是想到到反向生成模型,但数据库没有外键关系...

    最近工作中用到powerdesigner ,前期需要通过powerdesigner生成表结构,后来由于负责人员不在,很多表结构的添加没有同步到powerdesigner,一个个核对表结构着实麻烦,于是想到到反向生成模型,但数据库没有外键关系导致生成的模型也没有外键。对项目中不用外键感到好奇于是问了相关人员原因,并简单了解了外键的特点和使用场景。为了进一步了解,在网上找了相关文章以下为转载的原文链接: 
    http://www.cnblogs.com/pengxl/archive/2010/06/11/1756346.html

    今天听了一个企业技术总监的宣讲,结果听说在他开发系统的过程中,都没有用到外键,这让我很惊讶,赶紧上网搜索了一些资料看了看,终于明白了不用外键的原因。

    这是一篇关于是否使用外键的讨论,讲的很有道理: 
    对于主/外键/索引来说,在一些开发团队中被认为是处理数据库关系的利器,也被某些开发团队认为是处理某些具体业务的魔鬼,您的观点呢?在实际应用中您会采取哪种方式? 
    大家共同观点:主键和索引是不可少的,不仅可以优化数据检索速度,开发人员还省不其它的工作, 
    矛盾焦点:数据库设计是否需要外键。这里有两个问题:一个是如何保证数据库数据的完整性和一致性;二是第一条对性能的影响。 
    正方观点: 
    1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢? 
    2,有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。 
    3,外键在一定程度上说明的业务逻辑,会使设计周到具体全面。

    反方观点: 
    1,可以用触发器或应用程序保证数据的完整性 
    2,过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题 
    3,不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert, update, delete 数据的时候更快)eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在3个小时做完,如果加上外键,需要28个小时! 
    结论:1,在大型系统中(性能要求不高,安全要求高),使用外键;在大型系统中(性能要求高,安全自己控制),不用外键;小系统随便,最好用外键。2,用外键要适当,不能过分追求3,不用外键而用程序控制数据一致性和完整性时,应该写一层来保证,然后个个应用通过这个层来访问数据库。

    转载于:https://www.cnblogs.com/yangwujun/p/7132497.html

    展开全文
  • mysql如何添加一个表的外键1:创建一个父表,主键作为子表的外键:create table province(pId int primary key auto_increment,pName varchar(20));2:创建子表,外键是父表的主键:create table user(userId int ...

    mysql如何添加一个表的外键

    1:创建一个父表,主键作为子表的外键:

    create table province(

    pId int primary key auto_increment,

    pName varchar(20)

    );

    2:创建子表,外键是父表的主键:

    create table user(

    userId int primary key auto_increment,

    userName varchar(40),

    pid int,

    foreign key(pid) references province(pId)

    );

    给一张表添加外键,即给子表的外键添加主键的规则:

    在子表声明一个字段pid int,用于作为子表的外键,foreign key(子表的外键字段) references 父表的表名(父表的主键的字段名);

    3:当创建好数据表时添加外键约束:

    alter table user add foreign key(pid) references province(pId);

    alter table 子表的数据表名 add foreign key(子表的外键名称) references 父表的数据表名称(父表的主键名称);

    展开全文
  • MySQL数据库中主键和外键的操作

    千次阅读 2018-10-29 22:43:25
    在MySQL数据库中,一般会涉及到主键和外键,在上一个表中添加了主键之后,通常在下一个表中要添加外键,但是添加外键之后,在实体类和数据库中在加上上一个表的主键会比较好,这样两个表关联之后,在上一个表查询...
  • mysql数据库表格添加外键

    千次阅读 2019-05-22 12:58:17
    一个表格建好以后,需要和两一个表关联,添加外键代码: 将表格studentInfo中的rid字段设置为外键,与表格room关联(room中的rid为主键) ALTER TABLE studentInfo ADD CONSTRAINT FOREIGN KEY(rid) REFERENCES room...
  • 添加外键:添加一个外键到表。 删除外键:删除已选择的外键。 使用 名 编辑框来输入新键的名。 使用 参考模式、参考表 和 参考限制 下拉列表来分别选择一个外部索引数据库、表及限制。 要包含栏位到键,只需简单地...
  • 所以我试图将外键约束添加到我的数据库作为项目需求,它在不同的表上第一次或第二次工作,但我有两个表,在尝试添加外键约束时我得到一个错误。我得到的错误消息是:ERROR 1215(HY000):无法添加外键约束这是我用来...
  • 例如用户表与老师表之间:假设一个老师有多个学生,而每个学生只有这一个老师,老师与...在学生表中添加一个字段tid(用来指向teacher表的主键)二.在特定数据库打开命令列界面,修改student表添加外键通用建立外键m...
  • mysql数据库如何添加一个表的外键

    千次阅读 2019-07-21 15:54:01
    1:创建一个父表,主键作为子表的外键: 1 create table province( 2 pId int primary key auto_increment, 3 pName varchar(20) 4 ); 2:创建子表,外键是父表的主键: 1 create table user( 2 userId int primary ...
  • 关于主键的话大家很好理解,主键的主要作用就是用来标识一条数据是...通过将保存表中主键值的一列或多列中的值添加到另一个表中,可创建两个表之间的连接。这个列就成为第二个表的外键。它表示了两个表之间的关系...
  • 一、遇到的问题:在orders,agents,customers,products都建立好后在orders表中添加外键一个成功,三个失败 mysql> ALTER TABLE ORDERS -> ADD FOREIGN KEY(cid) REFERENCES CUSTOMERS(cid); Query OK, 16 ...
  • 外键指定一个列(或一组...添加外键:添加一个外键到表。删除外键:删除已选择的外键。使用 名 编辑框来输入新键的名。使用 参考模式、参考表 和 参考限制 下拉列表来分别选择一个外部索引数据库、表及限制。要包含栏...
  • 2.检查是否已经建立了索引,一个外键必然会有一个索引。3.检查是否表内已经存有数据,导致约束失败4.检查被参考键和参考键的类型是否相同5.检查是否重建了同名的索引,比如第一次建立失败,再次建立可能会因为索引...
  • 建外键的前提是此外键必须是另外一个表的主键。建外键的步骤:第一步、打开要建外键表的设计器,右击选择“关系”。第二步、然后弹出“外键关系”窗体,我们选择“添加”,然后点击“表和列规范”后面的小按...
  • 数据库18:外键

    2020-03-19 22:11:14
    数据库 十八、外键 外键:从表的公共字段 外键的约束主要是用来保证引用的完整性的,主外键的名字可以不一样,...set null: 让一个字段设置为NUll cascade : 跟着主表的变化而变化 添加外键 alter table score add f...
  • 定义如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从...
  • 因此,我作为项目需求试图将外键约束添加数据库中,并且它第次或在两不同的表上运行,但是在尝试添加外键约束时,我在两表上遇到错误。我收到的错误消息是:错误1215(HY000):无法添加外键约束这是我用来...
  • MySQL数据库基础入门——day10外键外键用于建立加强两表之间的联系,引入外链后,外键只能插入参照列存在的值,参照列被参照的值不能被删除,这就保证了数据的参照完整性。1.为表添加外键约束:想要真正连接两...
  • 是参考列与当前列类型不一致造成的。我的一个是int一个是bigint,改为相同的就可以了。
  • 想要真正连接两表的数据,就需要为表添加外键约束。添加外键约束的语法格式: ALTER TABLE 表名 ADD CONSTRAINT FK_ID FOREIGN KEY(外键字段名) REFERENCES 主表表名(主键字段名); 被引用的表为主表,引用外键的...
  • 数据库在有外键的时候删除

    千次阅读 2012-02-25 17:24:16
    级联删除的作用就和添加一个删除的触发器大致相同 下面就是一个设置外键并且设置级联删除的例子: alter table 表名 add constraint 外键名 foreign key(字段名) references 主表名(字段名) on delete ...
  • 使用sql创建表为表添加外键时出现error150 找了下发现别人总结的主要有3点: ...找不到引用 也就是引用的外键需要是一个主键 或者是unique的类型  3.2者的编码不一样      出现error1452...
  • 我有一个生产数据库,在其中我已重命名了几个作为外键的列。显然,以我的经验,mysql使这确实很痛苦。我的解决方案是删除所有索引和外键,重命名id列,然后重新添加索引和外键。这在用于开发数据库的Windows上的...
  • 我们的数据库中有一个名为company_competitors的表.有一项工作每天都会对其进行截断和加载.该表有两列company_id和competitor_id都引用另一个表公司.CREATE TABLE `company_competitors` (`id` bigint(20) NOT NULL ...
  • 一、什么是主键、外键? 1、关系型数据库中的一条... ②通过将表中主键值的一列或多列添加到另一个表中,可创建两个表之间的连接,这个列就成为第二个表的外键。 ③外键约束的目的是控制存储在外表中的数据,同时...
  • 1,两个字段的类型或者大小不严格匹配,例如,如果一个是INT(10), 那么外键也必须设置成INT(10), 而不是 INT(11) 也不能是 TINYINT. 你得使用 SHOW 命令来查看字段的大小,因为一些查询浏览器有时候把 int(10) 和int...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 963
精华内容 385
关键字:

数据库添加一个外键