精华内容
下载资源
问答
  • 还有十五分钟图书馆关闭,赶紧来把今天的关于MySQL外键修改的内容记录一下。 背景: 在写作业的时候必要的建立了两个数据表。...修改外键字段类型为int(10) 先修改了数据表users的字段id为int(10). alter table us...

    还有十五分钟图书馆关闭,赶紧来把今天的关于MySQL外键修改的内容记录一下。

    背景:
    在写作业的时候必要的建立了两个数据表。
    users表和records表修改前如下所示:
    在这里插入图片描述
    在这里插入图片描述
    可以看出开始的情况是:
    records的user_id是外键,引用数据表users的字段id。
    在这里插入图片描述在这里插入图片描述
    目的
    修改外键的字段类型为int(10)
    先修改了数据表users的字段id为int(10).
    alter table users
    然后修改数据表records的user_id为int(10).是不能完成的。之前添加了约束才把它设置成外键的,为什么一定要设置一个约束呢???我还没有猫懂,但是这次更改后直接添加外键约束也是成功了的。
    过程
    1、解除外键约束
    alter table records drop foreign key jfdksj;
    在这里插入图片描述
    2、修改外键引用表的主键字段类型(毫无障碍)
    alter table users modify id int(10);
    在这里插入图片描述
    3、修改外键所在字段的字段类型
    alter table records modify user_id int(10);
    在这里插入图片描述
    4、使字段不为空(设置not nulll时一定要带上字段类型才会成功,据说是这样)
    alter table records modify user_id int(10) not null;
    在这里插入图片描述
    在这里插入图片描述
    手打的希望一个字母都没错
    copy完图片已经关灯了,猫黑再放个连接。(我的键盘并没有背光灯)
    参考:
    添加一个外键
    修改字段类型
    ?回寝室啦,明天又是要打代码的一天。

    展开全文
  • 数据库主键外键约束

    2020-06-03 21:36:53
    3、外键CONSTRAINT fk_rl FOREIGN KEY(deptId) REFERENCES tb_dept1(id) 表间关系: 一对一 一对多 多对多 MySQL5.6中文支持问题 DEFAULT CHARSET=GB2312; 查看创建表是sql ...创建外键约束 CREATE TAB

    3、外键CONSTRAINT fk_rl FOREIGN KEY(deptId) REFERENCES tb_dept1(id)

    表间关系:
    一对一
    一对多
    多对多
    MySQL5.6中文支持问题
    DEFAULT CHARSET=GB2312;

    查看创建表是sql
    show create table 表名;

    外键特点:
    外键关联时主表要先去从表创建
    外键字段的值必然在主表中是可以一一对应的
    外键可以为空,但是不为空的外键必然可以在主表中跟它对于
    外键关联的必然是主表的主键
    创建外键约束
    CREATE TABLE score (
    id int(10) NOT NULL PRIMARY KEY auto_increment,
    sid INT(10),
    name varchar(50) DEFAULT NULL,
    subject varchar(50) DEFAULT NULL,
    score varchar(50) DEFAULT NULL,
    CONSTRAINT fk_sid
    FOREIGN KEY(sid) REFERENCES studentinfo(id)
    )ENGINE=InnoDB DEFAULT CHARSET=GB2312;

    修改变时添加外键约束
    alter table 表名 add CONSTRAINT fk_sid FOREIGN KEY(sid) REFERENCES studentinfo(id)

    示例代码:
    父表;
    create table school(id int(11) primary key not null auto_increment ,name varchar(11));
    子表;
    create table score(id int(11) primary key not null auto_increment,cid in t(11),foreign key(cid) references school(id));

    删除外键约束
    ALTER TABLE score drop FOREIGN KEY 外键名

    1.我打开test这个库里面,我新建一个表.我在查询里面就可以执行这个语句.
    它这个默认字符集有问题.我建议大家全部改成gb2312.
    学生成绩表.他是要关联到学生信息表里面.
    学生信息表里面有学号.学号在成绩里也是要有体现的.
    要建立外键关联.
    我们在创建外键约束的时候,关联外键.

    查询创建表创建结构.
    show create table 表名;

    三大范式:
    设计表的时候的规范:
    第一范式:信息不可再分.

    4,唯一性约束:
    特点:主键在一个表里面有且只能有一个. 具有唯一性. 数据类型只能是整数;
    但是在唯一性里面可以有多个.
    设置了唯一性约束的字段,表中有且只能有一个空值.
    创建表的时候,设置唯一性约束,
    create table tb_dept1(id int(11) p
    rimary key,name varchar(25) unique
    , locaotion varchar(50));

    修改表的时候,添加唯一性约束.
    create table tb_dept2(id int(11) p
    rimary key,name varchar(25), locao
    tion varchar(50));

    修改表的时候,添加唯一性约束:
    alter table tb_dept2 add unique (name);

    删除唯一性约束:(用index删除)
    alter table tb_dept2 drop index name;

    起别名:
    alter table tb_dept2 add constraint lo_name unique(locaotion);

    修改唯一约束:
    alter table tb_dept1 change locaotion locaotion varchar(25) default ‘beijing’;

    6.非空约束(not null)
    特点: 一张表中可以设置多个字段非空,主键默认非空.

    create table tb_dept3 (id int(11) ,name varchar(35),location varchar(50));

    ALTER TABLE tb_dept3 CHANGE name name varchar(34) not null;

    展开全文
  • MySQL数据库——外键约束

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


    把用户信息及其收货地址保存在数据中

    方案一:单张表

    创建表

    create table user_info(
      id char(36) primary key,
      user_name varchar(30) not null,
      password varchar(30) not null,
      real_name varchar(8),
      mobile char(11),
      address varchar(150)
    );
    

    表中的id使用由java工具类生成的UUID保证id的唯一性
    插入数据

    insert into user_info (id,user_name,password,real_name,mobile,address) 
    values ('1e8e8d94-61b3-40b3-8e80-4890119d7c74','appache','123456','Lucy','18920120206','USA');
    
    insert into user_info (id,user_name,password,real_name,mobile,address) 
    values ('e6952417-96f9-4f61-8f8e-a67ff6b4bb69','appache','123456','Tom','18617297545','UE');
    
    insert into user_info (id,user_name,password,real_name,mobile,address)
    values ('e4d4aaf2-6412-41ad-9157-acec294f0b36','appache','123456','Tim','17694976949','Japan');
    

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

    方案二:两张表

    创建表user_info

    create table user_info(
      id char(36) primary key,
      user_name varchar(30) unique not null,
      password varchar(30) not null
    )
    

    插入数据

    insert into user_info (id,user_name,password) values ('1e8e8d94-61b3-40b3-8e80-4890119d7c74','appache','123456');
    

    第一张表插入数据
    创建表address

    create table address(
      id char(36) primary key,
      user_info_id char(36),
      real_name varchar(8) not null,
      mobile char(11) not null,
      address varchar(150) not null
    )
    

    user_info_id对应 user_info表中的id字段
    插入数据

    insert into address (id,user_info_id,real_name,mobile,address) 
    values ('bfb9472a-7911-4e6f-a479-3b719454ebab','1e8e8d94-61b3-40b3-8e80-4890119d7c74','Lucy','18920120206','USA');
    insert into address (id,user_info_id,real_name,mobile,address) 
    values ('5227c6b9-45a2-44aa-8ac0-1f63a38d3b65','1e8e8d94-61b3-40b3-8e80-4890119d7c74','Tom','18617297545','UE');
    insert into address (id,user_info_id,real_name,mobile,address) 
    values ('30b8584b-aa6a-4516-a623-03f487058586','1e8e8d94-61b3-40b3-8e80-4890119d7c74','Tim','17694976949','Japan');
    

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

    insert into address (id,user_info_id,real_name,mobile,address) values ('7da42cc6-36a6-4ad5-9998-71dbc30c8e17','ddc376dd-f8b3-42a6-b42a-db22abed1941','xiaowang','18338970095','China');
    

    向address表中插入数据
    如果这里如果把user_info表中的数据删除但此时地址表中数据将不再完整,这些地址没有与之对应的用户。此时addres表中与之前用户对应的收货地址成为了垃圾信息。
    把user_info中的数据删除
    address表中的数据依然存在
    这里只是逻辑上的“外键”关系,所以还需要手动删除address表中对应的数据。

    显然逻辑上的"外键"关系需要依靠操作者的自觉性,依然无法保证数据的完整性。

    方案三:两张表并添加外键约束

    创建表user_info

    create table user_info(
      id char(36) primary key,
      user_name varchar(30) not null,
      password varchar(30) not null
    )
    

    插入一条数据

    insert into user_info (id,user_name,password) values ('1e8e8d94-61b3-40b3-8e80-4890119d7c74','appache','123456');
    

    创建表address的同时添加外键约束

    create table address(
      id char(36) primary key,
      user_info_id char(36),
      real_name varchar(8) not null,
      mobile char(11) not null,
      address varchar(150) not null,
      #下面这条语句就是在user_info_id添加了外键,指向user_info表的主键
      foreign key(user_info_id) references user_info(id)
    )
    

    插入数据

    insert into address (id,user_info_id,real_name,mobile,address) 
    values ('bfb9472a-7911-4e6f-a479-3b719454ebab','1e8e8d94-61b3-40b3-8e80-4890119d7c74','Lucy','18920120206','USA');
    insert into address (id,user_info_id,real_name,mobile,address) 
    values ('5227c6b9-45a2-44aa-8ac0-1f63a38d3b65','1e8e8d94-61b3-40b3-8e80-4890119d7c74','Tom','18617297545','UE');
    insert into address (id,user_info_id,real_name,mobile,address) 
    values ('30b8584b-aa6a-4516-a623-03f487058586','1e8e8d94-61b3-40b3-8e80-4890119d7c74','Tim','17694976949','Japan');
    

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

    insert into address (id,user_info_id,real_name,mobile,address) values ('7da42cc6-36a6-4ad5-9998-71dbc30c8e17','ddc376dd-f8b3-42a6-b42a-db22abed1941','xiaowang','18338970095','China');
    

    这里会报错

    insert into address (id,user_info_id,real_name,mobile,address) values ('7da42cc6-36a6-4ad5-9998-71dbc30c8e17','ddc376dd-f8b3-42a6-b42a-db22abed1941','xiaowang','18338970095','China')
    > 1452 - Cannot add or update a child row: a foreign key constraint fails (`user_info`.`address`, CONSTRAINT `address_ibfk_1` FOREIGN KEY (`user_info_id`) REFERENCES `user_info` (`id`))
    > 时间: 0.009s
    

    如果这里删除表user_info,也会报错

    #以下两条语句中的任意一条即可
    delete from user_info
    delete from user_info where id = '1e8e8d94-61b3-40b3-8e80-4890119d7c74';
    

    这里也会报错

    delete from user_info
    > 1451 - Cannot delete or update a parent row: a foreign key constraint fails (`user_info`.`address`, CONSTRAINT `address_ibfk_1` FOREIGN KEY (`user_info_id`) REFERENCES `user_info` (`id`))
    > 时间: 0.019s
    

    如果想要向address表中插入数据必须要和user_info_id指向的user_info表中的id相对应,否则无法插入
    如果想要删除user_info表中的数据,必须把指向他的主键对应的数据先全部删除,否则无法删除

    所以这种方案起到了保护数据完整性的作用,推荐使用该方案。


    删除user_info表中的id=1e8e8d94-61b3-40b3-8e80-4890119d7c74数据

    1. 先把address表中user_info_id指向该id的数据删除
    delete from address where user_info_id = '1e8e8d94-61b3-40b3-8e80-4890119d7c74';
    

    结果如下
    删除后的address表
    2. 这时就可以删除user_info表中的数据

    delete from user_infor where id = '1e8e8d94-61b3-40b3-8e80-4890119d7c74';
    

    user_infor表中的数据删除成功

    展开全文
  • Oracle数据库-外键约束

    千次阅读 2018-03-08 16:48:48
    在企业实战中有80%的企业不使用外键约束,有20%的企业使用外键约束,所以,外键约束加与不加,看的是实际情况下的公司要求是怎样的那问题来了,外键约束的作用是什么??1. 就是当两张表关联时,是通过id关联的, 外键所.....

    还是一样,首先我们先来了解一下什么是外键约束:

        所谓外键就是为了建立表与表之间的关系。外键是可以重复的,可以为空的。

        通常情况下一个表的外键是另外一张表的主键。

    在企业实战中有80%的企业不使用外键约束,有20%的企业使用外键约束,所以,

    外键约束加与不加,看的是实际情况下的公司要求是怎样的

    那问题来了,外键约束的作用是什么??

    1.

        就是当两张表关联时,是通过id关联的,

        外键所存在的表的字段正常情况下是可以随便填的,但没有丝毫意义,

        当添加了外键约束时,这个数就被限制起来了,只允许填入主表所有的id,

        如果在Oracle数据库中手动或代码写入无任何意义的id,

        则会报一个 " 违反完整约束条件,未找到父项关键字 " 的错误

    2.

        就是在当你设置了外键约束后,删除主表是无法删除的,只有通过先删除子表,再删除主表才可以删除

        会报一个"违反完整约束条件-已找到子记录"

        打个比方说,班级表与学生表相关联,班级表为主表,学生表是子表,那么这俩表相关联后就无法先删除班级表

        因为:"班级下还有学生"

    那如何通过代码实现外加约束的创建:

        alter  table  表名  add  constraint  外键约束名称  foreign  key  (外键字段名)  reference  参考的表名(id字段名);


    展开全文
  • E-R图也称实体-联系图(Entity Relationship Diagram), 提供了表示实体类型、属性联系的方法,用来描述现实世界的概念模型。  它是描述现实世界关系概念模型的有效方法。  是表示概念关系模型的一种方式。 ...
  • java-数据库——外键约束

    千次阅读 2018-06-19 09:33:20
    外键约束是很常用的一种保证数据完整性的约束具体表现是: 在从表中保存主表的主键先有的是主表 后有的是从表比如 部门员工 实例创建 部门表create table dept ( dept_id int primary key auto_increment, dept_...
  • mysql数据库-外键约束

    2019-08-16 15:00:57
    1.类型一致 2.被引用字段是唯一的 3.表的数据要清空
  • 关系型数据库外键约束与关联

    千次阅读 热门讨论 2020-10-07 18:22:57
    外键用于支持关系型数据库的 “参照完整性”,外键具有保持数据完整性一致性的机制,对业务处理有着很好的校验作用。 举例说明:假设 Table user 的 Column user.id 为主键(Primary key),Table profile 的 ...
  • 在学习ssh做项目的时候,控制台遇到了这个异常 Unable to execute schema ...我是直接删掉原先的数据库和所有约束,让 hibernate 自动创建表,可能还有其他的解决办法~ ps:也可能我说的不太对,望谅解。
  • 2.字段约束:外键约束 (2.1)外键约束 (2.2)外键约束的一个小范例 (2.3)为什么不建议使用外键约束 定义数据表的时候,一般都需要主键约束,非空约束等字段约束。了解字段约束之前,需要先了解数据库的范式...
  • 关闭数据库外键约束

    千次阅读 2017-08-06 19:54:27
    当向数据库中插入数据的时候,如果有表之间的关系十分复杂,尤其是是存在各种外键关系,这是需要暂时关闭这种针对外键约束的检查,本文针对以下三种数据库进行了一个总结
  • 请编写 SQL 语句,为课程表 courses 中的 teacher_id 添加外键约束,使之能与教师表 teachers 中的 id 相关联。 //官方答案 ALTER TABLE courses ADD CONSTRAINT FOREIGN KEY (teacher_id) REFERENCES teachers...
  • 由于系统设计的需要,数据库中的表添加了
  • 数据库 外键和约束

    2017-07-04 17:12:21
     如果一个字段X在一张表(表一)中是主关键字,而在另外一张表(表二)中不是主关键字,则字段X称为表二的外键;换句话说如果关系模式R1中的某属性集不是自己的主键,而是关系模式R2的主键,则该属性集称为是关系...
  • 1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性完整性。 eg:数据库和应用是一...
  • 添加外键约束名字一定不能重复
  • 只有INNODB的数据库支持外键,修改my.ini文件设置default-storage-engine=INNODB 外键必须与参照列的数据类型必须相同(数值型要求长度符号都相同,字符串要求类型相同,长度可以不同)。 2.2设置外键
  • 数据库--外键约束

    2019-09-30 18:11:37
    约束分为表级约束和列级约束,针对一个字段约束称为列级约束,针对两个及两个以上的约束称为表级约束。 3.约束类型包括 NOT NULL(非空约束) PRIMARY KEY(主键约束) UNIQUE KEY(唯一约束) DEFAULT KEY(默认...
  • 数据库外键约束

    2018-09-14 18:01:08
    1 . cascade方式 在父表上update/delete记录时,同步update/delete掉子表的...要注意子表的外键列不能为not null   3. No action方式 如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作 ...
  • 数据库物理外键和逻辑外键

    千次阅读 2020-11-02 17:01:45
    有了外键,当做一些设计外键字段的增、删、更新操作之后,需要触发相关操作去检查, ​ 不得不消耗资源 ​ 4.外键还会印象需要请求对其他表内部加锁而容易出现死锁的情况 mysql的外键设计问题 虽然很多人都不推荐你...
  • 数据库表的外键约束

    2014-03-10 17:42:26
    外键约束: 父表: 学生表: create table stu( snumber varchar(10) primary key, sname varchar(10)); 子表: 成绩表: create table score (  id int auto_increment primary key ,  snumber varchar(10), ...
  • 数据库外键及其约束理解)

    万次阅读 2019-04-18 10:25:38
    如果一个字段X在一张表(表一)中是主关键字,而在另外一张表(表二)中不是主关键字,则字段X称为表二的外键;换句话说如果关系模式R1中的某属性集不是自己的主键,而是关系模式R2的主键,则该属性集称为是关系...
  • 数据库外键SQL语句的编写

    千次阅读 2021-01-16 22:05:54
    外键约束:对外键字段的值进行更新插入时会引用表中字段的数据进行验证,数据如果不合法则更新插入会失败,保证数据的有效性 2. 对于已经存在的字段添加外键约束 -- 为cls_id字段添加外键约束 alter table ...
  • 文章目录一、外键约束1、外键概念2、关联约束3、添加与删除外键4、集联删除二、MySQL索引1、创建唯一索引(三种方法)2、索引查询3、全文索引4、联合索引5、删除索引 一、外键约束 1、外键概念 外键:给关联字段创建...
  • Mysql数据库外键约束(foreign key)

    千次阅读 2017-04-09 21:19:01
    备注: 外键约束中,被约束字段的值必须来自父键的参考字段FR:海涛高软(QQ技术交流群:386476712)
  • 相信大家可能会遇到这样一个问题,数据库设置了外键,可还想删除数据库中的某些数据,怎么操作? 现在就教大家一个轻松的办法,不用删除外键就可以删除数据库中的一些数据,关键id还能从1开始,不用默认递增 首先...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 71,690
精华内容 28,676
关键字:

数据库字段外键约束和外键的区别