建表关系

1. 图书与出版社 一对多关系 图书是多 出版社是一

			一个出版社能否对应多本图书 可以
			一本图书能否对应多个出版社 不可以 版权问题
			规律1:
				有一个可以就是一对多
				有两个可以就是多对多
				两个都不可以,要么没关系,要么就是一对一
			规律2:
				一对多的情况下 外键字段建在多的一方
				多对多的情况下 无需考虑 因为单独建一张表 里面放两个外键字段 分别关联两张表
				一对一的情况下 建在任何一方都可以 推荐建在查询频率比较高的那张表中
				
		建立表与表之间的硬性关系,在mysql中建立表关系统一用foreign key关键字
			1. 必须先建被关联表
			2. 插入数据的时候 应该先插被关联表的数据 这样才合理 
			3. 级联更新 级联删除
			
		auto_increment只能修饰被设置成key的字段
			key:
				unique  递增肯定不唯一 所以可以用在unique
				primary key 同上
				外键不考虑
		# 图书与出版社 
			# 多是图书为关联表 一是出版社为被关联表
			# 建表的时候先建被关联表 再建关联表
			# 插入数据的时候先插被关联表 才合理
			# 外键字段建在多的一方(外键关联的必须是另一张表的主键或唯一键)
			# 思考每张表有什么字段名
		create table publish(
			id int not null unique auto_increment,
			name varchar(32),
			addr varchar(32)
		);
		create table book(
			id int primary key auto_increment,
			title char(32),
			price char(32),
			# 创建外键字段  外键字段通常是和另一张表id字段关联 起名字尽量
			publish_id int unique,
			# 关联的必须是主键或唯一键  references后写publish_id是错误的
			foreign key(publish_id) references publish(id)  
			on update cascade  # 同步更新
			on delete cascade  # 同步删除
		);
		# 插入表数据 
		insert into publish(name,addr) values
		('电子工业出版社','天津'),
		('北京出版社','北京'),
		('上海出版社','上海'),
		('航天出版社','酒泉')
		;
		
		# 再插关联表
		insert into book(title,price) values
		('MySQL必知必会',67),
		('python从入门到放弃','56'),
		('带你玩转Linux','89')
		;
					mysql> select * from book;
		+----+--------------------------+-------+------------+
		| id | title                    | price | publish_id |
		+----+--------------------------+-------+------------+
		|  1 | MySQL必知必会            | 67    |       NULL |
		|  2 | python从入门到放弃       | 56    |       NULL |
		|  3 | 带你玩转Linux            | 89    |       NULL |
		+----+--------------------------+-------+------------+
					mysql> select * from publish;
		+----+-----------------------+--------+
		| id | name                  | addr   |
		+----+-----------------------+--------+
		|  1 | 电子工业出版社        | 天津   |
		|  2 | 北京出版社            | 北京   |
		|  3 | 上海出版社            | 上海   |
		|  4 | 航天出版社            | 酒泉   |
		+----+-----------------------+--------+			
								
								
	#2.	图书与作者 多对多关系
			一个作者能否对应多本图书 可以
			一本图书能否对应多个作者 可以
		create table book(
			id int not null unique auto_increment,
			title varchar(32),
			price varchar(32)  # 千万不要加英文逗号
		);	
		create table author(
			id int primary key auto_increment,
			name char(32),
			age int            # 千万不要加都英文逗号
		);
		# 外键字段建在第三张表
		create table book2author(
			id int primary key auto_increment,
			book_id int,
			foreign key(book_id) references book(id)
			on update cascade
			on delete cascade,  # 千万不要少英文逗号
			author_id int,
			foreign key(author_id) references author(id)
			on update cascade
			on delete cascade
		);
		insert into book(title,price) values('傲慢与偏见',89),('围城',56);  # 1,2
		insert into author(name,age) values('简奥斯丁',28),('钱钟书',44),('歪果仁',38);  # 1,2,3
		insert into book2author(book_id,author_id) values(1,1),(1,2),(1,3),(2,1),(2,2),(2,3); # 错误
		 
	    #book表
		+----+-----------------+-------+    # 级联更新 级联删除的理解
		| id | title           | price |    # 删除book表不会对作者表产生影响,但会对第三张表有影响
		+----+-----------------+-------+    # 删作者表第三张表会动(因为作者表和第三张表是关联的)  book表不会动
		|  1 | 傲慢与偏见      | 89    |
		|  2 | 围城            | 56    |
		+----+-----------------+-------+
		#作者表		
		+----+--------------+------+
		| id | name         | age  |
		+----+--------------+------+
		|  1 | 简奥斯丁     |   28 |
		|  2 | 钱钟书       |   44 |
		|  3 | 歪果仁       |   38 |
		+----+--------------+------+	
		#第三张表
		+----+---------+-----------+
		| id | book_id | author_id |
		+----+---------+-----------+
		|  1 |       1 |         1 |
		|  2 |       1 |         3 |
		|  3 |       2 |         2 |
		+----+---------+-----------+
					
	#3.	一对一
		1. 将用户表拆分成 用户表与用户详情表
		2. 客户与学生
		
		id		name	age		phone	addr	hobby	is_dog
		1		Jason	18		110		安徽	read	 1
		2		tank	38		120		湛江	生蚝	 1
		3		egon	85		130		山东	bb		 1
		4		Jerry	28		140		云南	baby	 0
		-------------------------------------------------------
		id		name	age	 ┃	phone	addr	hobby	is_dog
		1		Jason	18	 ┃	110		安徽	read	 1
		2		tank	38	 ┃	120		湛江	生蚝	 1
		3		egon	85	 ┃	130		山东	bb		 1
		4		Jerry	28	 ┃	140		云南	baby	 0
		-------------------------------------------------------
		
		
		复制表
			create table xxx from select * from  tmp;  
			会创建出一张xxx表 并且表中的数据跟tmp是一模一样的
			但是没有键关系,只拷贝数据和表结构
		
		表操作
			first
			after
			change
原文地址:https://www.cnblogs.com/yuelinyan/p/12008552.html