精华内容
下载资源
问答
  • 因为数据库有时候会由于没有通过外键的检测而使得开发人员删除,插入操作失败.他们觉得这样很麻烦其实这正式外键在强制你保证数据的完整性和一致性.这是好事儿.例如:有一个基础数据表,用来记录商品的所有信息。其他...

    外键的作用,主要有两个:

    一个是让数据库自己通过外键来保证数据的完整性和一致性

    一个就是能够增加ER图的可读性

    有些人认为外键的建立会给开发时操作数据库带来很大的麻烦.因为数据库有时候会由于没有通过外键的检测而使得开发人员删除,插入操作失败.他们觉得这样很麻烦

    其实这正式外键在强制你保证数据的完整性和一致性.这是好事儿.

    例如:

    有一个基础数据表,用来记录商品的所有信息。其他表都保存商品ID。查询时需要连表来查询商品的名称。单据1的商品表中有商品ID字段,单据2的商品表中也有商品ID字段。如果不使用外键的话,当单据1,2都使用了商品ID=3的商品时,如果删除商品表中ID=3的对应记录后,再查看单据1,2的时候就会查不到商品的名称。

    当表很少的时候,有人认为可以在程序实现的时候来通过写脚本来保证数据的完整性和一致性。也就是在删除商品的操作的时候去检测单据1,2中是否已经使用了商品ID为3的商品。但是当你写完脚本之后系统有增加了一个单据3 ,他也保存商品ID找个字段。如果不用外键,你还是会出现查不到商品名称的情况。你总不能每增加一个使用商品ID的字段的单据时就回去修改你检测商品是否被使用的脚本吧,同时,引入外键会使速度和性能下降。

    (2) 添加外键的格式

    ALTER TABLE yourtablename

    ADD [CONSTRAINT 外键名] FOREIGN KEY [id] (index_col_name, ...)

    REFERENCES tbl_name (index_col_name, ...)

    [ON DELETE { CASCADE|  SET NULL  |  NO ACTION  |  RESTRICT } ]

    [ON UPDATE {  CASCADE |  SET NULL  |  NO ACTION  |  RESTRICT  } ]

    说明:

    ON DELETE/ ON UPDATE :用于定义delete,update操作.以下是update,delete操作的各种约束类型:

    CASCADE:

    外键表中外键字段值会被更新,或所在的列会被删除.

    RESTRICT:

    RESTRICT也相当于no action,即不进行任何操作.即,拒绝父表update外键关联列,delete记录.

    SET NULL :

    被父面的外键关联字段被update ,delete时,子表的外键列被设置为null.

    而对于insert,子表的外键列输入的值,只能是父表外键关联列已有的值.否则出错.

    外键定义服从下列情况:(前提条件)

    1)

    所有tables必须是InnoDB型,它们不能是临时表.因为在MySQL中只有InnoDB类型的表才支持外键.

    2)

    所有要建立外键的字段必须建立索引.

    3)

    对于非InnoDB表,FOREIGN KEY子句会被忽略掉。

    注意:

    创建外键时,定义外键名时,不能加引号.

    如: constraint 'fk_1' 或 constraint "fk_1"是错误的

    (3) 查看外键:

    SHOW CREATE TABLE ***;可以查看到新建的表的代码以及其存储引擎.也就可以看到外键的设置.

    删除外键:

    alter table drop foreign key '外键名'.

    注意:

    只有在定义外键时,用constraint 外键名 foreign key .... 方便进行外键的删除.

    若不定义,则可以:

    先输入:alter table drop foreign key -->会提示出错.此时出错信息中,会显示foreign key的系统默认外键名.--->

    用它去删除外键.

    (4) 举例

    实例一:

    4.1

    CREATE TABLE parent(id INT NOT NULL,

    PRIMARY KEY (id)

    ) TYPE=INNODB;                      -- type=innodb 相当于 engine=innodb

    CREATE TABLE child(id INT, parent_id INT,

    INDEX par_ind (parent_id),

    FOREIGN KEY (parent_id) REFERENCES parent(id)

    ON DELETE CASCADE

    ) TYPE=INNODB;

    向parent插入数据后,向child插入数据,插入时,child中的parent_id的值只能是parent中有的数据,否则插入不成功;

    删除parent记录时,child中的相应记录也会被删除;-->因为: on delete cascade

    更新parent记录时,不给更新;-->因为没定义,默认采用restrict.

    4.2

    若child如下:

    mysql>

    create table child(id int not null primary key auto_increment,parent_id int,

    index par_ind (parent_id),

    constraint fk_1 foreign key (parent_id) references

    parent(id) on update cascade on delete restrict)

    type=innodb;

    用上面的:

    1).

    则可以更新parent记录时,child中的相应记录也会被更新;-->因为: on update cascade

    2).

    不能是子表操作,影响父表.只能是父表影响子表.

    3).

    删除外键:

    alter table child drop foreign key fk_1;

    添加外键:

    alter table child add constraint fk_1 foreign key (parent_id) references

    parent(id) on update restrict on delete set null;

    (5) 多个外键存在:

    product_order表对其它两个表有外键。

    一个外键引用一个product表中的双列索引。另一个引用在customer表中的单行索引:

    CREATE TABLE product (category INT NOT NULL, id INT NOT NULL,

    price DECIMAL,

    PRIMARY KEY(category, id)) TYPE=INNODB;

    CREATE TABLE customer (id INT NOT NULL,

    PRIMARY KEY (id)) TYPE=INNODB;

    CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,

    product_category INT NOT NULL,

    product_id INT NOT NULL,

    customer_id INT NOT NULL,

    PRIMARY KEY(no),

    -- 双外键

    INDEX (product_category, product_id),

    FOREIGN KEY (product_category, product_id)

    REFERENCES product(category, id)

    ON UPDATE CASCADE ON DELETE RESTRICT,

    -- 单外键

    INDEX (customer_id),

    FOREIGN KEY (customer_id)

    REFERENCES customer(id)) TYPE=INNODB;

    (6) 说明:

    1.若不声明on update/delete,则默认是采用restrict方式.

    2.对于外键约束,最好是采用: ON UPDATE CASCADE ON DELETE RESTRICT 的方式.

    展开全文
  • 外键约束 type_id只能定义 但这样前台显示不了 ``` //$_POST['type_id'] = 11; $data = array( 'type_id' => intval(P('type_id')), 'title' => P('title'), 'zhaiyao' => P('zhaiyao'), ...
  • 创建数据库/表,向表中插入数据如果数据库不存在则创建,存在则不创建(if not exists),也可以省略不会报错。 创建testdate数据库,并设定编码集为utf8#创建数据库testdate;create database if not exists test02 ...

    创建数据库/表,向表中插入数据

    如果数据库不存在则创建,存在则不创建(if not exists),也可以省略不会报错。 创建testdate数据库,并设定编码集为utf8

    #创建数据库testdate;

    create database if not exists test02 default charset utf8 collate utf8_general_ci;

    删除数据库 drop database ;

    #删除数据库test01drop database test01;

    #在表中添加规则

    primary key #标识该字段为该表的主键,可以唯一的标识记录,主键就是不为空且唯一当然其还有加速查询的作用

    foreign key #标识该字段为该表的外键,用来建立表与表的关联关系

    not null #标识该字段不能为空

    unique key #标识该字段的值是唯一的

    auto_increment #标识该字段的值自动增长(整数类型,而且为主键)

    default #为该字段设置默认值

    unsigned #将整型设置为无符号即正数

    zerofill #不够使用0进行填充

    #创建表语法 create table table01("属性" 数据类型 not noll,...) engine=innodb default charset=utf8;不想字段为 NULL 可以设置字段的属性为 NOT NULL

    #AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1

    #其中字段加 ·· (反引号esc下面的按键)是为了区分关键字 也可以不用加,也可以运行成功

    #其中设置 id(要唯一,不能重复) (primary key主键,auto_increment自增)

    #创建students,以id为主键create table`students`(

    `id`int(10) not null auto_increment primary key,

    `snames`varchar(10) not null,

    `班级`varchar(10) not null,

    `出生日期` date

    )engine=innodb default charset=utf8;

    #创建成绩表grade_table,关联students表中外键create tablegrade_table(

    g_idint(10) not nullauto_increment,

    snamevarchar(10) not null,

    gardeint(10) not null,

    rankvarchar(10) not null,constraint fk_id foreign key (g_id) references students(id)

    on update cascade #更新同步

    on delete cascade #删除同步

    )engine=innodb default charset=utf8;;

    #fk_id 为外键约束索引,外键名称为 g_id,其依赖于表 students 的主键 id。

    #删除数据表:drop table ;drop table`grade_table`;

    #使用truncate 清空数据表不会进行删除操作truncate table students;

    向表中插入数据

    #插入数据语法:insert into 表名(列1,列2,列3,。。。,列n)values(value1,value2,。。。valuen),...,(。。。);

    #在students表中插入三行数据insert intostudents (id,snames,班级,出生日期)values(8,'小明','一班','2010-12-08'),

    (7,'小郑','二班','2008-06-18'),

    (10,'小红','三班','2009-11-08');

    #所有列进行添加数据的话,可不用把所有列写出来;如下在students表中搽插入id=12的一行数据

    #在students中插入一行数据,注意id不能有重复insert into students values (12,'小蓝','三班','2011-10-08');

    #在grade_table表中插入三行数据

    insert intograde_table(g_id,sname,garde,rank)values(8,'小明',70,'B'),

    (7,'小郑',90,'A'),

    (10,'小红',60,'C');

    students表:

    697c4803e38894e01cab66383a1d6541.png

    grade_table表

    3fee7306d54b99bbe88862f9faf89f4a.png

    展开全文
  • 2012-08-31 回答mysql外键设置...因为数据库有时候会由于没有通过外键的检测而使得开发人员删除,插入操作失败.他们觉得这样很麻烦其实这正式外键在强制你保证数据的完整性和一致性.这是好事儿.例如:有一个基础数...

    2012-08-31 回答

    mysql外键设置详解

    (1) 外键的使用:

    外键的作用,主要有两个:

    一个是让数据库自己通过外键来保证数据的完整性和一致性

    一个就是能够增加er图的可读性

    有些人认为外键的建立会给开发时操作数据库带来很大的麻烦.因为数据库有时候会由于没有通过外键的检测而使得开发人员删除,插入操作失败.他们觉得这样很麻烦

    其实这正式外键在强制你保证数据的完整性和一致性.这是好事儿.

    例如:

    有一个基础数据表,用来记录商品的所有信息。其他表都保存商品id。查询时需要连表来查询商品的名称。单据1的商品表中有商品id字段,单据2的商品表中也有商品id字段。如果不使用外键的话,当单据1,2都使用了商品id=3的商品时,如果删除商品表中id=3的对应记录后,再查看单据1,2的时候就会查不到商品的名称。

    当表很少的时候,有人认为可以在程序实现的时候来通过写脚本来保证数据的完整性和一致性。也就是在删除商品的操作的时候去检测单据1,2中是否已经使用了商品id为3的商品。但是当你写完脚本之后系统有增加了一个单据3 ,他也保存商品id找个字段。如果不用外键,你还是会出现查不到商品名称的情况。你总不能每增加一个使用商品id的字段的单据时就回去修改你检测商品是否被使用的脚本吧,同时,引入外键会使速度和性能下降。

    (2) 添加外键的格式:

    alter table yourtablename

    add [constraint 外键名] foreign key [id] (index_col_name, ...)

    references tbl_name (index_col_name, ...)

    [on delete {cascade | set null | no action | restrict}]

    [on update {cascade | set null | no action | restrict}]

    说明:

    on delete/on update,用于定义delete,update操作.以下是update,delete操作的各种约束类型:

    cascade:

    外键表中外键字段值会被更新,或所在的列会被删除.

    restrict:

    restrict也相当于no action,即不进行任何操作.即,拒绝父表update外键关联列,delete记录.

    set null:

    被父面的外键关联字段被update ,delete时,子表的外键列被设置为null.

    而对于insert,子表的外键列输入的值,只能是父表外键关联列已有的值.否则出错.

    外键定义服从下列情况:(前提条件)

    1)

    所有tables必须是innodb型,它们不能是临时表.因为在mysql中只有innodb类型的表才支持外键.

    2)

    所有要建立外键的字段必须建立索引.

    3)

    对于非innodb表,foreign key子句会被忽略掉。

    注意:

    创建外键时,定义外键名时,不能加引号.

    如: constraint 'fk_1' 或 constraint "fk_1"是错误的

    (3) 查看外键:

    show create table ***;可以查看到新建的表的代码以及其存储引擎.也就可以看到外键的设置.

    删除外键:

    alter table drop foreign key '外键名'.

    注意:

    只有在定义外键时,用constraint 外键名 foreign key .... 方便进行外键的删除.

    若不定义,则可以:

    先输入:alter table drop foreign key -->会提示出错.此时出错信息中,会显示foreign key的系统默认外键名.--->

    用它去删除外键.

    展开全文
  • 需求:在插入顾客信息后产生cust_id,然后做为订单表的外键继续插入订单信息。 Customer 类中有List orderList属性用于存放订单信息。 insert into customer(cust_name,cust_address) values(#{custName},#{...

    案例

    如题:具体描述如下。主表customer自增主键为cust_id。从表订单表外键为cust_id。
    数据库框架Mybatis
    需求:在插入顾客信息后产生cust_id,然后做为订单表的外键继续插入订单信息。
    Customer 类中有List orderList属性用于存放订单信息。

    insert into customer(cust_name,cust_address) values(#{custName},#{custAddress}); insert into `order`(order_date, cust_id) 问题是:这里的cust_id取不到值,为null? values(#{order.orderDate},#{custId}),

    总结

    操作主从表,可以参考改之!

    展开全文
  • Enity framework 怎么向一个有外键的table插入数据。 比如一个student表: Id(主键) Name ClassId(外键,Class表的主键) 一个Class表: Id(主键,student的外键) Name 当我用ef(版本3.5)插入一条...
  • 怎么向多个表中插入数据。。比如有五六个表,类似student,course,speciality,teacher这些表。 一条一条插入很麻烦吧,应该有更好的方法。但我只会用一条一条插入 能不能用循环一次性插很多条。我只能实现一次插...
  • 2.使用自增主键的场景:a:表中找不出3个以内字段可以表示的业务主键b:没有集中大量的插入操作c:不使用自增id作为外键(即id变化不影响系统逻辑和功能)此外自增主键的规律很明显,为了不让别...
  • 如 A表有个id name:名称 num:数量 B表有个 id Aid:外键A表...现在有个excel表格 有属性 name num encoding 属性 前面俩有可能相同 如 同一名称的 东西有num个 ,怎么在A表插入一个数据的情况 向B表插入相应个数的数据
  • ### mysql数据库#### 知识要点:1.... 外键约束的参照操作### 数据操作#### 插入数据方法一:```sqlINSERT [INTO] table_name [(column_name,...)]{VALUES|VALUE} ({expr|DEFAULT},...),(...),...;`...
  • ![图片说明]... 已建立用户商品多对多关系表,中间表的主键为用户,商品表的外键id,但是同一用户多次购买同一件商品,中间表中只有一条该用户与商品的记录,请问该怎么解决
  • 现在通过JDBC连接数据库数据库中有两张表,存在主外键关系插入一条数据,另一张表就要插入多条,中间通过一个oid字段连接。这个字段是通过序列自增序列,现在的问题是,我怎么在存入数据的时候,再取出来这个自增...
  • 约束主要有一下几种:NOT NULL : 用于控制字段的内容一定不能为空(NULL)。UNIQUE : 控件字段内容不能重复,一个表允许有多个 Unique 约束。PRIMARY KEY: 也是用于控件字段内容不能... 也能防止非法数据插入外键列,...
  • 用户名密码登录系统,用户发表文章,将文章信息保存到数据库时将当前用户id也保存到文章表里作为外键,要怎么实现?
  • 数据库插入和删除都比较麻烦,甚至会抛出异常。 程序的性能差 良好的数据库设计: 节省内存空间 保证数据的完整性 方便我们开发系统 屏蔽使用物理外键 怎么设计数据库 分析需求:分析业务和需要处理的数据 ...
  • 我用的vs2010 开发C/S项目,连接sql server 2008数据,用一条sql语句把包含外键的数据插入一张表中,莫名其妙的是其他字段的数据都能插入,唯有这个外键插入是-1,而且这种情况也只是偶尔发生!而且在其他电脑上测试...
  • 【表A】与【表B】之间有外键约束(具体怎么约束的无所谓,因为外键和事务死锁没有绝对关系)。【表A】=主键表,【表B】=外键表。 公司有几位程序员写的代码总是出现死锁,现在将事务死锁情况重现. using(事务) { try...
  • mysql数据库,我要向一张表里面插入一条数据,其中id值取这个字段最大值,另外有两个外键,需要从其他表里查询,请问这个语句怎么写?
  • 预约表的主键id是预约详情表的外键,当添加预约表的时候,我们会有好几条预约详情表的数据需要添加,这个时候我们需要获取预约表的主键id,但是我们的预约表中的主键id是自增长的,在插入预约表的时候我们并不能获取...
  • 文章目录简介创建数据库创建表添加主键约束在建表的时候指定主键定义列的同时指定主键定义完所有列之后指定主键修改表的结构指定主键外键约束常用约束唯一约束非空约束默认约束自动增加查看表结构修改表的结构修改...
  • (1)分别定义ScoreDB数据库中各基表的主键、外键,实现实体完整性约束和参照完整性约束; (2)往student表插入一条跟已有的学号相同的学生数据,验证实体完整性约束; (3)向score表中插入一条数据,其中数据中的...
  • 外键约束的使用 在进行多表查询的时候,...那怎么样来得到保证呢,其实,我们可以通过外键约束来约束它。 外键约束(foreign key),这个外键的作用就可以保证我们这样一个数据表的一致性和完整性。 也可以通过...
  • 深入浅出MySQL数据库开发、优化与管理维护

    千次下载 热门讨论 2014-01-21 15:48:01
     17.6 使用外键需要注意的问题   17.7 小结   第18章 SQL优化   18.1 优化SQL语句的一般步骤   18.1.1 通过showstatus命令了解各种SQL的执行频率   18.1.2 定位执行效率较低的SQL语句   18.1.3 ...
  • 25.2 mysql.sock丢失后怎么连接数据库? 107 25.3 同一台机器运行多个mysql: 108 25.4 查看用户权限: 109 25.5 修改用户密码: 110 25.6 怎样灵活的指定连接的主机: 111 25.7 到底匹配哪个符合条件的用户: 111 ...
  • 1.3.5 怎么能让应用运行得更快 42 1.3.6 DBA与开发人员的关系 44 1.4 小结 45 第2章 体系结构概述 46 2.1 定义数据库和实例 47 2.2 SGA和后台进程 52 2.3 连接Oracle 54 2.3.1 专用服务器 54 2.3.2 共享...
  • 有两个问题: [b][color=red][size=large]1、spring和hibernate中的一对多问题(包括添加、删除和更行)~我现在这么写代码规范吗?...如果单单用sql语句是可以插入的~但是我想用hibernate的特性把参数值set进去~thanks
  • 前言 话说这学习啊,真是一件有趣的事情,这是最近慢慢体会到的事情,现在逐渐的体会到了这其中的某些乐趣,这不今天在整牛腩...说白了就是外键约束,比如B表存在一个字段b,有外键约束,引用于A表的主键a,那么在向B
  • 匿名用户1级2015-07-20 回答mybatis自增主键配置:mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同。基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键。主要说明下在...
  •  使用数据库是MS SQL Server2005,创建一个表,其中有ID列为identity,在程序中需要获取刚刚插入数据的ID值作为另一个表的外键,在Store Procedure可以用output子句,但用java怎么获取呢?  有人说用...
  • 1.3.5 “怎么能让应用运行得更快?” 41 1.3.6 DBA与开发人员的关系 45 1.4 小结 46 第2章 体系结构概述 47 2.1 定义数据库和实例 48 2.2 SGA和后台进程 53 2.3 连接Oracle 56 2.3.1 专用服务器 56 2.3.2 ...

空空如也

空空如也

1 2 3
收藏数 50
精华内容 20
关键字:

数据库怎么插入外键