标准SQL的外键约束条件

  1): 子表引用父表的主键

drop table if exists child,parent;

create table if not exists  parent(
id int not null auto_increment primary key,
v int
); create table if not exists child(
id int not null auto_increment primary key,
parent_id int not null,
v int,
constraint fk__child__parent_id foreign key (parent_id) references parent(id)
); insert into parent(id,v) values(1,100);
insert into child(parent_id,v) values(1,1000);
insert into child(parent_id,v) values(1,1000); select * from parent;
+----+------+
| id | v |
+----+------+
| 1 | 100 |
+----+------+ select * from child;
+----+-----------+------+
| id | parent_id | v |
+----+-----------+------+
| 1 | 1 | 1000 |
| 2 | 1 | 1000 |
+----+-----------+------+

  2): 子表引用交表的唯一索引

create table if not exists  parent(
id int not null,
v int,
constraint unique index uix__parent_id (id)
); create table if not exists child(
id int not null auto_increment primary key,
parent_id int not null,
v int,
constraint fk__child__parent_id foreign key (parent_id) references parent(id)
); insert into parent(id,v) values(1,100);
insert into child(parent_id,v) values(1,1000);
insert into child(parent_id,v) values(1,1000); select * from parent;
+----+------+
| id | v |
+----+------+
| 1 | 100 |
+----+------+ select * from child;
+----+-----------+------+
| id | parent_id | v |
+----+-----------+------+
| 1 | 1 | 1000 |
| 2 | 1 | 1000 |
+----+-----------+------+

innodb在标准SQL上做的扩展

  1): 只要在父表上有在对应的列上建索引,那么这个列就能在子表中引用

create table if not exists  parent(
id int not null auto_increment primary key,
v int,
index uix__parent_v (v) -- 只要父表上有索引就行
); create table if not exists child(
id int not null auto_increment primary key,
parent_v int not null,
v int,
constraint fk__child__parent_v foreign key (parent_v) references parent(v) -- 在子表中引用
); insert into parent(id,v) values(1,100);
insert into parent(id,v) values(2,100); insert into child(parent_v,v) values(100,2000);
insert into child(parent_v,v) values(100,2000); select * from parent;
+----+------+
| id | v |
+----+------+
| 1 | 100 |
| 2 | 100 |
+----+------+ select * from child;
+----+----------+------+
| id | parent_v | v |
+----+----------+------+
| 1 | 100 | 2000 |
| 2 | 100 | 2000 |
+----+----------+------+

我的评介

  主外键约束在标准SQL下体现的是一种一对多的关系,但是经过MySQL的拓展之后可以表现出“多对多”的关系;虽然MySQL这样

  的设计有一定的灵活性,个人觉得最好还是使用标准SQL的方式。

学习交流

-----------------------------http://www.sqlpy.com-------------------------------------------------

-----------------------------http://www.sqlpy.com-------------------------------------------------

MySQL 主外键约束与标准SQL不同的地方的更多相关文章

  1. C# 如何物理删除有主外键约束的记录?存储过程实现

    十年河东,十年河西,莫欺少年穷 本篇主旨是如何物理删除有主外键约束的记录!那么,我们从主外键走起! 下面新建三张有主外键约束的表,分别为:系/学院表,专业班表,学生表,如下: CREATE TABLE ...

  2. Oracle开发 之 主-外键约束FK及约束的修改

    试验环境: 1)数据库版本:oracle 11.2.0.4 2)建表脚本:以scott的dept及emp表为基础. 父表:dept -- Create table create table DEPT ...

  3. 批量删除MSSQL 中主外键约束

    转自: http://www.maomao365.com/?p=813 在制作 MSSQL同步工具的时候,发现由于主外键的约束,导致数据同步异常,所有我们需要把 读数据库里面的主外键约束,进行批量删除 ...

  4. MySQL 建立外键约束

    http://www.jzxue.com/shujuku/mysql/201109/06-8742.html MySQL 建立外键约束的语法太晦涩难懂了, 不得不记下笔记. 1. 在建表时建立外键 C ...

  5. 两种获取MySql数据库中所有表的主键和外键约束信息的Sql语句

    最近在写Rafy底层的一些东西,在数据库方面把MySql数据库集成到里面去,里面有一个需求,需要获取非系统数据库,也就是我们自己建立的数据库中所有表的主键和外键元数据列表. 第一种方法:是网上的方法, ...

  6. SQL server 添加主外键约束

    ---添加主键约束   alter table 表名 add constraint 约束名 primary key (主键)          - --添加唯一约束   alter table 表名 ...

  7. 通过sql命令建表 和 主外键约束以及其他约束

    create table命令 create table dept ( dept_id int primary key, dept_name ) not null, dept_address ) ) c ...

  8. MySQL数据库--外键约束及外键使用

    什么是主键.外键关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键. 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯 ...

  9. mysql添加外键约束变为索引

    今天有位自己填上一坑:mysql储存引擎 原因就是数据库表引擎为:MyISAM,建立主外键关系需要是InnoDB: 解决方案:alter  table table_name1  engine=inno ...

随机推荐

  1. Hessian 原理分析

    Hessian 原理分析 一.远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http . tcp . u ...

  2. Python-统计svn变更代码行数

    1 #!/bin/bash/python 2 # -*-coding:utf-8-*- 3 #svn统计不同url代码行数变更脚本,过滤空行,不过滤注释. 4 import subprocess,os ...

  3. vue key

    有相同父元素的子元素必须有独特的 key.重复的 key 会造成渲染错误. <ul> <li v-for="item in items" :key="i ...

  4. Oracle Data Integrator 12c----一致性 CDC(Consistent CDC)

    一致性 CDC 中引入了变化集的概念.一个变化集中可以包括多个相互存在关联关系(如主外键引用关系)的表.CDC 在捕获和发布一个变化集中的变化时能够保证数据的一致性.这个练习介绍如何使用能够保证一致性 ...

  5. 表访问方式---->全表扫描(Full Table Scans, FTS)

    全表扫描(Full Table Scans, FTS) 全表扫描是指Oracle在访问目标表里的数据时,会从该表所占用的第一个区(EXTENT)的第一个块(BLOCK)开始扫描,一直扫描到该表的高水位 ...

  6. Yii2框架bootstrap样式理解

    Yii2框架默认採用了bootstrap作为CSS风格,各种视图类组件都如此.之前一直採用默认风格,并在必要的时候加入或者改动一下class来达到目的.但在改版Yii1.1的orange项目时.发现之 ...

  7. qt坐标系统与布局的简单入门

     qt坐标系统 qt坐标系统比較简单 ); 上面的代码把button显示为父窗体的20,20处宽度为100,高度为100 接下去是布局 qt里面布局须要增加<QLayout.h>这个头 ...

  8. jenkins里面使用批处理命令进行自动部署

    http://blog.csdn.net/hwhua1986/article/details/47974047

  9. mysql8.x开启远程登录

    mysql8.x密码的认证方式变了,需要修改远程认证方式 问题描述 Connection to lab-130-mysql failed.Unable to load authentication p ...

  10. Linux命令行监控网口流量

    1.ifconfig [网卡名] ifconfig eth0 . 2. /proc/net/dev cat /proc/net/dev . 3. 使用watch命令配合 ifconfig, cat / ...