MYSQL数据库之如何在已经建立好表之后重构数据表

表一:
mysql> select * from employee;
+----+--------+---------+
| id | name | manager |
+----+--------+---------+
| 1 | 张三 | 李红 |
| 2 | 张三 | 李红 |
| 3 | 王五 | 刘倩 |
| 4 | 马六 | 马芳 |
| 5 | 孙杨 | 明德 |
| 6 | 郭德纲 | 华北 |
+----+--------+---------+

表二:
表二的数据填充有所不同,如下:
sql:insert into manager(name) select manager from employee group by manager;

mysql> select * from manager;
+----+------+
| id | name |
+----+------+
| 1 | 刘倩 |
| 2 | 华北 |
| 3 | 明德 |
| 4 | 李红 |
| 5 | 马芳 |
+----+------+

如何把两张表连接起来?并且将employee表里面的manager存储的数据变为manager表的id?

sql: update employee as e inner join manager as m on e.manager=m.name set e.ma
nager=m.id;

此时的表:mysql> select * from employee;
+----+--------+---------+
| id | name | manager |
+----+--------+---------+
| 1 | 张三 | 4 |
| 2 | 张三 | 4 |
| 3 | 王五 | 1 |
| 4 | 马六 | 5 |
| 5 | 孙杨 | 3 |
| 6 | 郭德纲 | 2 |
+----+--------+---------+
mysql> desc employee;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | smallint(6) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| manager | varchar(20) | NO | | NULL | |
+---------+-------------+------+-----+---------+----------------+
此时manager的数据类型还是varchar类型,同时manager这个名字也不合适。那么如何修改呢?

sql: alter table employee change manager manager_id smallint not null;

+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| id | smallint(6) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| manager_id | smallint(6) | NO | | NULL | |
+------------+-------------+------+-----+---------+----------------+

同时应该键入外键,与父表联系起来。

sql:alter table employee add constraint FK_ma_em foreign key (manager_id) ref
erences manager(id) on update cascade on delete cascade;

mysql> desc employee;
+------------+-------------+------+-----+---------+----------------+
| Field | Type| Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| id | smallint(6) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| manager_id | smallint(6) | NO | MUL | NULL | |
+------------+-------------+------+-----+---------+----------------+
上面的操作流程如下:创建manager-->插入数据-->更新employee-->插入外键;

那么有没有方法将上面的步骤省略一两步呢?比如说在创建数据表的同时就将数据插入进去。

sql: create table employee2
(
id smallint unsigned auto_increment primary key,
employee_name varchar(20) not null
)
select name from employee group by name;

你是不是认为这样是正确的呢?让我们来看看现在建立的表的结构吧!

mysql> select * from employee2;
+----+---------------+--------+
| id | employee_name | name |
+----+---------------+--------+
| 1 |                             | 孙杨 |
| 2 |                             | 张三 |
| 3 |                             | 王五 |
| 4 |                             | 郭德纲 |
| 5 |                             | 马六 |
+----+---------------+--------+

那么正确的解决方案应该是:

sql: create table employee2
(
id smallint unsigned auto_increment primary key,
name varchar(20) not null
)
select name from employee group by name;

mysql> select * from employee2;
+----+--------+
| id | name |
+----+--------+
| 1 | 孙杨 |
| 2 | 张三 |
| 3 | 王五 |
| 4 | 郭德纲 |
| 5 | 马六 |
+----+--------+
注意:你创建新表的字段的名字要和查询到的想要插入的字段的名字应该保持一致。

时间: 2024-10-13 12:37:03

MYSQL数据库之如何在已经建立好表之后重构数据表的相关文章

如何让mysql数据库允许被远程连接访问(业务机连数据机)

点击链接时,弹出错误提示:  ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL server  第一:更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称'%'. 然后新建查询 输入:flush rivileges(刷新系统权限表) 或者新加条记录,"host" 项为

数据库语句之建表、拷贝数据表

1.数据库建表语句 create table tb_People(id integer primary key, Name varchar(255), Sex varchar(255)) 2.同数据库拷贝数据表 sql: insert into table1 select*from table2(完全拷贝) insert into table1 select distinct*from table2(不重复拷贝); insert into table1 select top 10*from ta

实现在mysql数据库中保存text大文本和blob大二进制数据

项目代码如下: config配置文件: className=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/lob user=root password=root com.itheima.util包下DBUtil.java package com.itheima.util; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IO

json代码驾照考题批量加入MySQL数据库 ps.executeUpdate()永远只能悲催的加一条数据 去掉id主键自增 for 与 foreach

package com.swift; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; im

mongo 分片机如何建立库和实例(数据表)

mongo分片创建表和实例 第一步:首先在admin账户下: mongo 'mongodb://root:[email protected]:3717/admin' 第二步:查看是否有数据库 show dbs 第三步:没有库则创建 , 注意:需要使用createUser()创建 新库的权限即 readWrite读写权限 示例: 第一需要 数据库分片activity为库名 sh.enableSharding("activity") 第二: use activity db.createUs

在VisualStadio2015上使用EF6.0建立MySql数据库

1.新建工程 2.建立类的文件夹DAL 3.建立相关类 [Student类] using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace ETTest3{ public class Student { public int Id { get; set; } public string LastName { get;

一、MySQL数据库基础

1.1.数据库模型 数据库由一批数据构成有序集合,这些数据被存在结构化的数据表中.数据表之间互相关联,反应客观事物间的本质联系.数据库系统提供对数据的安全控制和完整性控制.数据库的发展大致划分为几个阶段:人工管理阶段.文件系统阶段.数据库系统阶段.高级数据库阶段.其种类大概有3种:层次式数据库.网络式数据库和关系式数据库. 文本数据库缺陷:数据冗余和不一致,数据访问困难,数据孤立,完整性问题,原子性问题并发访问问题,安全性问题. 数据库系统的特性:数据管理独立性:有效地完成数据存取:数据完整性和

MySQL数据库存储引擎与数据库优化

存储引擎 (1)MySQL可以将数据以不同的技术存储在文件(内存)中,这种技术就成为存储引擎. 每种存数引擎使用不同的存储机制.索引技巧.锁定水平,最终提供广泛且不同的功能. (2)使用不同的存储引擎也可以说不同类型的表 (3)MySQL支持的存储引擎 MyISAM InnoDB Memory CSV Archive 查看数据表的创建语句: SHOW CREATE TABLE 表名 相关概念: (1).并发控制:一个人读数据,另外一个人在删除这个数据. 当多个连接对记录进行修改时保证数据的一致性

MYSQL数据库错误代码提示汇总

Mysql出错代码表 1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件导致删除数据库失败 1010:不能删除数据目录导致删除数据库失败 1011:删除数据库文件失败 1012:不能读取系统表中的记录 1020:记录已被其他用户修改 1021:硬盘剩余空间不足,请加大硬盘可用空间 1022:关键字重复,更改记录失败 1023:关闭时发生错误 1024:读文件错误 1025:更改名字时发生错误