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 | 馬六 |
+----+--------+
注意:你創建新表的字段的名字要和查詢到的想要插入的字段的名字應該保持一致。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM