mysql中外键的一些基本操作

  1 带外键的两个表,当插入记录的时候必须先在父表中插入记录,然后在子表中插入记录
  2 父表
  3 mysql> create table provinces(
  4     -> id smallint unsigned primary key auto_increment,
  5     -> pname varchar(30) not null
  6     -> );
  7
  8 查看数据表引擎
  9 mysql> show create table provinces;
 10 +-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 11 | Table     | Create Table                                                                                                                                                              |
 12 +-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 13 | provinces | CREATE TABLE `provinces` (
 14   `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
 15   `pname` varchar(30) NOT NULL,
 16   PRIMARY KEY (`id`)
 17 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
 18 +-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 19 1 row in set (0.00 sec)
 20
 21 子表(子表中的外键的数据类型和父表中对应做外键的键的数据类型要一致,不然会出错)
 22 创造外键
 23 mysql> create table users(
 24     -> id smallint unsigned primary key auto_increment,
 25     -> username varchar(30) not null,
 26     -> pid smallint unsigned,
 27     -> foreign key (pid) references provinces (id)
 28     -> );
 29 Query OK, 0 rows affected (0.65 sec)
 30
 31 cascade    从父表删除或更新且自动删除或更新子表中匹配的行
 32 set null    从父表删除或更新行,并设置子表中的外键列为null。如果使用该选项,必须保证
 33 子表列没有指定not null
 34 restrict    拒绝对父表的删除或更新操作
 35 no action    标准SQL关键字,在MySQL中雨restrict相同
 36
 37 创建数据表,加上cascade
 38 mysql> create table users1(
 39     -> id smallint unsigned primary key auto_increment,
 40     -> username varchar(30) not null,
 41     -> pid smallint unsigned,
 42     -> foreign key (pid) references provinces (id) on delete cascade                -> );
 43 Query OK, 0 rows affected (0.65 sec)
 44
 45
 46 对数据表进行添加删除
 47 mysql> insert provinces (pname) values (‘A‘);
 48 Query OK, 1 row affected (0.11 sec)
 49
 50 mysql> insert provinces (pname) values (‘B‘);
 51 Query OK, 1 row affected (0.08 sec)
 52
 53 mysql> insert provinces (pname) values (‘C‘);
 54 Query OK, 1 row affected (0.05 sec)
 55
 56 mysql> select * from provinces;
 57 +----+-------+
 58 | id | pname |
 59 +----+-------+
 60 |  1 | A     |
 61 |  2 | B     |
 62 |  3 | C     |
 63 +----+-------+
 64 3 rows in set (0.00 sec)
 65
 66 mysql> insert users1 (username, pid) values(‘Mike‘, 3);
 67 Query OK, 1 row affected (0.09 sec)
 68
 69 由于父表中不存在id等于7的情况,所以报错
 70 mysql> insert users1 (username, pid) values(‘John‘, 7);
 71 ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`t1`.`users1`, CONSTRAINT `users1_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `provinces` (`id`) ON DELETE CASCADE)
 72 mysql> insert users1 (username, pid) values(‘John‘, 2);
 73 Query OK, 1 row affected (0.24 sec)
 74
 75 mysql> insert users1 (username, pid) values(‘Tom‘, 1);
 76 Query OK, 1 row affected (0.09 sec)
 77
 78 mysql> select * from users1;
 79 +----+----------+------+
 80 | id | username | pid  |
 81 +----+----------+------+
 82 |  1 | Mike     |    3 |
 83 |  3 | John     |    2 |
 84 |  4 | Tom      |    1 |
 85 +----+----------+------+
 86 3 rows in set (0.00 sec)
 87
 88 删除父表中id为3的记录
 89 mysql> delete from provinces where id = 3;
 90 Query OK, 1 row affected (0.15 sec)
 91
 92 mysql> select * from provinces;
 93 +----+-------+
 94 | id | pname |
 95 +----+-------+
 96 |  1 | A     |
 97 |  2 | B     |
 98 +----+-------+
 99 2 rows in set (0.00 sec)
100
101 对子表产生了影响
102 mysql> select * from users1;
103 +----+----------+------+
104 | id | username | pid  |
105 +----+----------+------+
106 |  3 | John     |    2 |
107 |  4 | Tom      |    1 |
108 +----+----------+------+
109 2 rows in set (0.00 sec)
110
111 数据表的更新操作:
112 update set命令用来修改表中的数据。
113 update set命令格式:update 表名 set 字段=新值,… where 条件;
114
115 mysql> update users1 set username = ‘wuxie‘ where id = 3;
116 Query OK, 1 row affected (0.15 sec)
117 Rows matched: 1  Changed: 1  Warnings: 0
118
119 mysql> select * from users1;
120 +----+----------+------+
121 | id | username | pid  |
122 +----+----------+------+
123 |  3 | wuxie    |    2 |
124 |  4 | Tom      |    1 |
125 +----+----------+------+
126 2 rows in set (0.00 sec)
127
128 mysql> update users1 set username = ‘John‘, pid = 3 where id = 1;
129 Query OK, 0 rows affected (0.00 sec)
130 Rows matched: 0  Changed: 0  Warnings: 0
131
132 mysql> select * from users1;
133 +----+----------+------+
134 | id | username | pid  |
135 +----+----------+------+
136 |  3 | wuxie    |    2 |
137 |  4 | Tom      |    1 |
138 +----+----------+------+
139 2 rows in set (0.00 sec)
时间: 2024-07-31 14:25:54

mysql中外键的一些基本操作的相关文章

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

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

mysql中外键的创建与删除

外键的创建 方法1:创建表的时候设置(外键名随机生成) 1.前提条件,必须要有一个主表,这里设为persons 2.主表中必须设置主键字段primary key,这里设为id_p //创建数据库database(test) create database if not exists test character set utf8; //创建主表(persons) create table if not exists persons( id_p int not null, lastName var

Mysql中外键的 Cascade ,NO ACTION ,Restrict ,SET NULL

如果在父表中找不到候选键,则不允许在子表上进行insert/update 外键约束对父表的含义: 在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决于:在定义子表的外键时指定的on update/on delete子句, InnoDB支持5种方式, 分列如下 1 . cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录 On delete cascade从mysql3.23.50开始可

Mysql 外键设置

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

MySQL之外键约束

MySQL之外键约束 MySQL有两种常用的引擎类型:MyISAM和InnoDB.目前只有InnoDB引擎类型支持外键约束.InnoDB中外键约束定义的语法如下: [CONSTRAINT [symbol]] FOREIGN KEY    [index_name] (index_col_name, ...)    REFERENCES tbl_name (index_col_name,...)    [ON DELETE reference_option]    [ON UPDATE refere

MySQL外键及级联删除 && 表的存储引擎与创建索引 && 删除数据库和表

Messages表: mysql>create table Messages( ->message_id int auto_increment primary key, ->user_name varchar(50) not null, ->author_id int not null, ->body text, ->forum_id int not null); Forums表: mysql>create table Forums( ->forum_id

细聊MySQL之常用工具及基本操作(二)

接细聊MySQL之常用工具及基本操作(一) 四.客户端管理工具mysqlcheck的使用.mysqlcheck是客户端表维护工具,可以检查.修复.优化或分析表. 如 shell> mysqlcheck databasename tablename [options] databasename为数据库名 tablename为表名 如果你只指定databasename,通常会检查databasename下所有的表.如果你既不指定databasename,也不指定tablename,那么一定要添加参数

细聊MySQL之常用工具及基本操作(三)

细聊MySQL之常用工具及基本操作(一) 细聊MySQL之常用工具及基本操作(二) 七.使用mysqlshow工具查看数据库.表和列的信息.具体语法: shell> mysqlshow [options] [db_name [tbl_name [col_name]]] 注:如果没有数据库给定,列出数据库列表 如果没有表给定,列出所有数据库的表 如果没有列给定,列出表内所有的列 详细参数如下: 参数 描述 适用 弃用 --bind-address=ip_address 同mysql命令 --com

mysql(三) 数据表的基本操作操作

mysql(三) 数据表的基本操作操作 创建表,曾删改查,主键,外键,基本数据类型. 1. 创建表 create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空 )ENGINE=InnoDB DEFAULT CHARSET=utf8 例如: 类型解释: 是否可以为空: 是否可空,null表示空,非字符串 not null - 不可空 null - 可空 默认值设置 默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值 create table t