MySQL外键关联(创世纪新篇)

数据库外键

  • 01.mysql> show create table country\G 
    02.*************************** 1. row *************************** 
    03.       Table: country 
    04.Create Table: CREATE TABLE `country` ( 
    05.  `country_id` smallint(5) unsigned NOT NULL auto_increment, 
    06.  `country` varchar(50) NOT NULL, 
    07.  `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, 
    08.  PRIMARY KEY  (`country_id`) 
    09.) ENGINE=InnoDB DEFAULT CHARSET=utf8 
    10.1 row in set (0.01 sec) 
    11. 
    12.mysql> show create table city\G 
    13.*************************** 1. row *************************** 
    14.       Table: city 
    15.Create Table: CREATE TABLE `city` ( 
    16.  `city_id` smallint(5) unsigned NOT NULL auto_increment, 
    17.  `city` varchar(50) NOT NULL, 
    18.  `country_id` smallint(5) unsigned NOT NULL, 
    19.  `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, 
    20.  PRIMARY KEY  (`city_id`), 
    21.  KEY `country_id` (`country_id`), 
    22.  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) 
    23.) ENGINE=InnoDB DEFAULT CHARSET=utf8 
    24.1 row in set (0.00 sec) 
    25.mysql> select * from city; 
    26.+---------+----------+------------+---------------------+ 
    27.| city_id | city     | country_id | last_update         | 
    28.+---------+----------+------------+---------------------+ 
    29.|       1 | hancheng |          1 | 2012-01-09 09:18:33 | 
    30.+---------+----------+------------+---------------------+ 
    31.1 row in set (0.01 sec) 
    32. 
    33.mysql> select * from country; 
    34.+------------+---------+---------------------+ 
    35.| country_id | country | last_update         | 
    36.+------------+---------+---------------------+ 
    37.|          1 | chen    | 2012-01-09 09:16:38 | 
    38.+------------+---------+---------------------+ 
    mysql> show create table country\G
    *************************** 1. row ***************************
           Table: country
    Create Table: CREATE TABLE `country` (
      `country_id` smallint(5) unsigned NOT NULL auto_increment,
      `country` varchar(50) NOT NULL,
      `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
      PRIMARY KEY  (`country_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.01 sec)

    mysql> show create table city\G
    *************************** 1. row ***************************
           Table: city
    Create Table: CREATE TABLE `city` (
      `city_id` smallint(5) unsigned NOT NULL auto_increment,
      `city` varchar(50) NOT NULL,
      `country_id` smallint(5) unsigned NOT NULL,
      `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
      PRIMARY KEY  (`city_id`),
      KEY `country_id` (`country_id`),
      CONSTRAINT `city_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    mysql> select * from city;
    +---------+----------+------------+---------------------+
    | city_id | city     | country_id | last_update         |
    +---------+----------+------------+---------------------+
    |       1 | hancheng |          1 | 2012-01-09 09:18:33 |
    +---------+----------+------------+---------------------+
    1 row in set (0.01 sec)

    mysql> select * from country;
    +------------+---------+---------------------+
    | country_id | country | last_update         |
    +------------+---------+---------------------+
    |          1 | chen    | 2012-01-09 09:16:38 |
    +------------+---------+---------------------+

    01.mysql> update country set country_id=100 where country_id=1; 
    02.ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test/city`, CONSTRAINT `city_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`)) 
    mysql> update country set country_id=100 where country_id=1;
    ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test/city`, CONSTRAINT `city_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`))

    上面的问题是说因为有关联的存在,所以无法改变country_id这个字段。

    然后自己又重新看了下书本,发现自己的sql语句中没有innodb的外键约束方式(cascade,set null,no action,restrict),感觉这就是自己出问题的地方。

    可是怎么加入关联方式呢,上网找了好半天也没有合适的方法。就自己找呗,就通过老师说的方法,? help一点儿一点儿终于找到了怎么改变的方法,文档功能很强大啊

    01.| ADD {INDEX|KEY} [index_name] [index_type] (index_col_name,...) 
    02.  | ADD [CONSTRAINT [symbol]] 
    03.        PRIMARY KEY [index_type] (index_col_name,...) 
    04.  | ADD [CONSTRAINT [symbol]] 
    05.        UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...) 
    | ADD {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
      | ADD [CONSTRAINT [symbol]]
            PRIMARY KEY [index_type] (index_col_name,...)
      | ADD [CONSTRAINT [symbol]]
            UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...)
    写了后又是一大堆的错误,无从下手啊

    01.mysql> alter table city add CONSTRAINT `city_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON UPDATE CASCADE; 
    02.ERROR 1005 (HY000): Can‘t create table ‘.\test\#sql-ed0_37.frm‘ (errno: 121) 
    03.zhouqian@zhou :~$ perror 121 
    04.OS error code 121:  Remote I/O error 
    05.MySQL error code 121: Duplicate key on write or update 
    06.  
    07.Can‘t create table ‘test.icity‘ (errno: 150)-----我这里也建立索引了。网上的说法是:字段类型和外键的索引 
    mysql> alter table city add CONSTRAINT `city_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON UPDATE CASCADE;
    ERROR 1005 (HY000): Can‘t create table ‘.\test\#sql-ed0_37.frm‘ (errno: 121)
    zhouqian@zhou :~$ perror 121
    OS error code 121:  Remote I/O error
    MySQL error code 121: Duplicate key on write or update
     
    Can‘t create table ‘test.icity‘ (errno: 150)-----我这里也建立索引了。网上的说法是:字段类型和外键的索引

    这里是重新建立一张表icity,结果可以了,总结可能是因为字段类型的问题,可是我的alter的问题还是没有解决呢:

    01.mysql> create table icity(id int not null, city varchar(20), country_id smallint unsigned not null , primary key(id), foreign key(country_id) references country(country_id) on update cascade )engine=innodb; 
    02.Query OK, 0 rows affected (0.11 sec) 
    03. 
    04.mysql> show create table icity\G 
    05.*************************** 1. row *************************** 
    06.       Table: icity 
    07.Create Table: CREATE TABLE `icity` ( 
    08.  `id` int(11) NOT NULL, 
    09.  `city` varchar(20) DEFAULT NULL, 
    10.  `country_id` smallint(5) unsigned NOT NULL, 
    11.  PRIMARY KEY (`id`), 
    12.  KEY `country_id` (`country_id`), 
    13.  CONSTRAINT `icity_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON UPDATE CASCADE 
    14.) ENGINE=InnoDB DEFAULT CHARSET=latin1 
    15.1 row in set (0.02 sec) 
    mysql> create table icity(id int not null, city varchar(20), country_id smallint unsigned not null , primary key(id), foreign key(country_id) references country(country_id) on update cascade )engine=innodb;
    Query OK, 0 rows affected (0.11 sec)

    mysql> show create table icity\G
    *************************** 1. row ***************************
           Table: icity
    Create Table: CREATE TABLE `icity` (
      `id` int(11) NOT NULL,
      `city` varchar(20) DEFAULT NULL,
      `country_id` smallint(5) unsigned NOT NULL,
      PRIMARY KEY (`id`),
      KEY `country_id` (`country_id`),
      CONSTRAINT `icity_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    1 row in set (0.02 sec)
     
    在大家(老师和网友)的帮助下终于搞定了,做法先drop掉表里的外键,然后在add。呵呵……

    01.mysql> alter table city drop FOREIGN KEY `city_ibfk_1`; 
    02.Query OK, 0 rows affected (0.24 sec) 
    03.Records: 0  Duplicates: 0  Warnings: 0 
    04. 
    05.mysql> alter table city add FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON UPDATE CASCADE;Query OK, 0 rows affected (0.16 sec) 
    06.Records: 0  Duplicates: 0  Warnings: 0 
    07. 
    08.mysql> show create table city\G 
    09.*************************** 1. row *************************** 
    10.       Table: city 
    11.Create Table: CREATE TABLE `city` ( 
    12.  `city_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, 
    13.  `city` varchar(50) NOT NULL, 
    14.  `country_id` smallint(5) unsigned NOT NULL, 
    15.  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    16.  PRIMARY KEY (`city_id`), 
    17.  KEY `country_id` (`country_id`), 
    18.  KEY `idx_fk_country_id` (`country_id`), 
    19.  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON UPDATE CASCADE 
    20.) ENGINE=InnoDB DEFAULT CHARSET=utf8 
    21.1 row in set (0.00 sec)

    大功告成

    end

时间: 2024-10-16 06:44:07

MySQL外键关联(创世纪新篇)的相关文章

mysql外键引发的锁等待

有这样两条sql: insert table_a (bId) value(1); -- sql-1  update table_b set b.xx=123 where b.id =1; -- sql-2 其中,table_a的字段bId是个外键:外键关联的正是table_b的id字段. 在mysql上执行这两条数据时,sql-1会锁住sql-2.我们的系统中,为这一个锁,发生了不知道多少的锁等待,更引发了不知道多少的死锁. 特此备忘.

4Python全栈之路系列之MYSQL外键

Python全栈之路系列之MySQL外键 先来个例子来说明什么是外键以及外键的作用,so,XO公司现正处于一种迅速发展的状态,从最初的12人的团队发展到现在的300人,那么问题就来了,发展的越快,人员与部门就越来越多,这是老大要求我们做一个人员管理系统,用于查询入职人员的信息等. 起初我们想用一个表来实现所有的人员统计,创建Personnel库,用于存放公司员工的信息,指令如下: CREATE DATABASE personnel DEFAULT CHARSET utf8 COLLATE utf

mysql外键使用和事物使用

mysql外键功能主要是为了保证关联表数据的一致性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有 客户号,客户名称 b表中存有 每个客户的订单 有了外键后 你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x 建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键). 指定主键关键字: foreign key(列名) 引用外键关键字: references <外键表名>(外键列名) 事件触发限制:

MySQL外键使用及说明(简单易懂)

MySQL外键使用及说明 一.外键约束 MySQL通过外键约束来保证表与表之间的数据的完整性和准确性. 外键的使用条件:  1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持): 2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立:  3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以: 外键的好

mysql外键添加error1215

在mysql创建表外键的过程中,由于操作不当,会提示cannot add foreign key constraint的错误. 造成此错误可能的原因如下: 1.数据类型不匹配,外键与其相关联的键必须数据类型和长度都相同. 2.表类型必须都为InnoDB 3.表的字符编码必须相同 4.外键关联的键可能不存在 5.外键在设置时,On Delete或者On Update事件如果设置为SET NULL,则表定义时,必须选择Allow NULL

hibernate一对一双向外键关联

一对一双向外键关联:双方都持有对方的外键关联关系. 主控方和一对一单向外键关联的情况是一样的,主要的差异表现为,被空方需要添加: @OneToOne(mappedBy="card") //被控方 主控方必须交给其中的一方去控制,因为不可以双方都同时拥有控制对方的权利,假如是这样的话是没有办法保存成功的.这就是为什么需要指定mappenBy="card"的原因. 1.IdCard.java实体类: package oto_bfk; import javax.persi

关于mysql中外键关联的一些个人理解

在我看来hibernate最麻烦的一件事就是配置外键关联,稍微不慎就会出现配置错误的情况,现在的项目全部都是在使用mybaits,而mybaits使用就简单的多,起码虽然说是要自己写mysql语句,但是起码这种做法在现阶段的项目开发中还是非常的流行,以前经常听到眼言论说用hibernate开发会比mybaits要来得快,其实那应该 是对于高手而言,但是绝大部分如我这群菜逼而言,老老实实的写sql语句会更好一点,废话不多说,今天主要是谈谈外键关联对在项目开发中的影响. 表的关联,在某种程度上来说只

hibernate5(12)注解映射[4]一对一外键关联

在实际博客站点中,文章内容的数据量非常多,它会影响我们检索文章其他数据的时间,如查询公布时间.标题.类别的等. 这个时候,我们能够尝试将文章内容存在还有一张表中,然后建立起文章--文章内容的一对一映射 一对一关联有两种方式,一种是外键关联.还有一种是复合主键关联. 外键关联 以下我们先看一个一对一单向关联的实例 /*************关联关系维护方************/ @Table(name = "t_article") @Entity public class Artic

Mysql 外键设置

MySql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个:    一个是让数据库自己通过外键来保证数据的完整性和一致性    一个就是能够增加ER图的可读性    有些人认为外键的建立会给开发时操作数据库带来很大的麻烦.因为数据库有时候会由于没有通过外键的检测而使得开发人员删除,插入操作失败.他们觉得这样很麻烦其实这正式外键在强制你保证数据的完整性和一致性.这是好事儿.    例如:    有一个基础数据表,用来记录商品的所有信息.其他表都保存商品ID.查询时需要连表来查询商品的名称