1. 程式人生 > >MySQL:向已有資料表中插入新的一列資料

MySQL:向已有資料表中插入新的一列資料

一、需求

有兩個表格,test和test2如下所示:

mysql> select * from test;
+------+------+------------+
| data | id   | timestamp  |
+------+------+------------+
|  300 |    3 | 1536292800 |
|  200 |    2 | 1536292808 |
+------+------+------------+

mysql> select * from test2;
+------+------+
| data | id   |
+------+------+
| 10 | 3 | | 20 | 2 | +------+------+
1. 需求A

在test表格上直接操作,增加一列為context_time,資料型別為datetime,並賦值為對應的行的UNIX time的datetime,如下表所示(可以延伸為對每一行的某個欄位進行相同的運算或函式操作後賦值到新的欄位):

+------+------+------------+---------------------+
| data | id   | timestamp  | context_time        |
+------+------+------------+---------------------+
| 300 | 3 | 1536292800 | 2018-09-07 12:00:00 | | 200 | 2 | 1536292808 | 2018-09-07 12:00:08 | +------+------+------------+---------------------+
2. 需求B

將表格test2中的data欄位查詢出來後根據id拼接到test表格後面,欄位名為new_data,如下所示:

+------+------+------------+---------------------+----------+
| data | id   | timestamp  | context_time        | new_data |
+------+------+------------+---------------------+----------+
| 300 | 3 | 1536292800 | 2018-09-07 12:00:00 | 10 | | 200 | 2 | 1536292808 | 2018-09-07 12:00:08 | 20 | +------+------+------------+---------------------+----------+

二、解決方案

1. 需求A的解決方案
  • 先使用alter命令在原表格test上建立新的欄位context_time,資料型別為datetime,預設不為NULL
mysql> alter table test add context_time datetime not NULL;

mysql> select * from test;
+------+------+------------+---------------------+
| data | id   | timestamp  | context_time        |
+------+------+------------+---------------------+
|  300 |    3 | 1536292800 | 0000-00-00 00:00:00 |
|  200 |    2 | 1536292808 | 0000-00-00 00:00:00 |
+------+------+------------+---------------------+
  • 然後使用update命令更新context_time的值:
mysql> update test set context_time=from_unixtime(timestamp);

mysql> select * from test;
+------+------+------------+---------------------+
| data | id   | timestamp  | context_time        |
+------+------+------------+---------------------+
|  300 |    3 | 1536292800 | 2018-09-07 12:00:00 |
|  200 |    2 | 1536292808 | 2018-09-07 12:00:08 |
+------+------+------------+---------------------+
2. 需求B的解決方案
  • 先使用alter命令在原表格test上建立新的欄位new_data,資料型別為int,預設為NULL
mysql> alter table test add new_data int;

mysql> select * from test;
+------+------+------------+---------------------+----------+
| data | id   | timestamp  | context_time        | new_data |
+------+------+------------+---------------------+----------+
|  300 |    3 | 1536292800 | 2018-09-07 12:00:00 |     NULL |
|  200 |    2 | 1536292808 | 2018-09-07 12:00:08 |     NULL |
+------+------+------------+---------------------+----------+
  • 然後使用update、inner join、select共同實現更新值:
mysql> update test inner join (select data, id from test2)tmp on test.id=tmp.id set test.new_data=tmp.data;

mysql> select * from test;
+------+------+------------+---------------------+----------+
| data | id   | timestamp  | context_time        | new_data |
+------+------+------------+---------------------+----------+
|  300 |    3 | 1536292800 | 2018-09-07 12:00:00 |       10 |
|  200 |    2 | 1536292808 | 2018-09-07 12:00:08 |       20 |
+------+------+------------+---------------------+----------+

三、結論

  • alter命令用於修改表結構,update命令用於修改或更新表的資料(值)
  • 不管怎樣,要增加一列新的資料,必須先使用alter命令修改原表的結構,增加新的欄位、資料型別和預設值
  • alter命令還可以修改欄位名、調整欄位順序等
  • 如果是需求A,僅僅對原表已有欄位進行相同操作後作為新欄位,那麼使用最簡單的update、set命令即可
  • 如果是需求B,使用inner join就是類似表聯結的問題了,必須有主鍵(id)對應每一行資料,否則更新後的資料整一列都將是查詢的第一個資料的值,像這樣:
mysql> update test inner join (select data from test2)tmp set test.new_data=tmp.data;

mysql> select * from test;
+------+------+------------+---------------------+----------+
| data | id   | timestamp  | context_time        | new_data |
+------+------+------------+---------------------+----------+
|  300 |    3 | 1536292800 | 2018-09-07 12:00:00 |       10 |
|  200 |    2 | 1536292808 | 2018-09-07 12:00:08 |       10 |
+------+------+------------+---------------------+----------+

mysql> select data from test2;
+------+
| data |
+------+
|   10 |
|   20 |
+------+
  • 另外,對於需求B,搜尋解決辦法的時候遇到有如下的寫法,但是mysql中是不可以這樣用的,其他SQL server我就沒嘗試了(我是以學習mysql為主=。=)
mysql> update test set test.new_data=(select data from test2);
ERROR 1242 (21000): Subquery returns more than 1 row
  • 最後,一開始我是在折騰insert指令的,但是其實insert是插入行資料,和我想要的並不一樣,舉個栗子(會增加行然後預設填充為預設值,這裡是NULL):
mysql> select * from test;
+------+------+
| data | id   |
+------+------+
|  100 |    1 |
|  200 |    2 |
+------+------+

mysql> alter table test add new_data int;

mysql> select * from test;
+------+------+----------+
| data | id   | new_data |
+------+------+----------+
|  100 |    1 |     NULL |
|  200 |    2 |     NULL |
+------+------+----------+

mysql> insert into test(new_data) select (data+1) as new_data from test;

mysql> select * from test;
+------+------+----------+
| data | id   | new_data |
+------+------+----------+
|  100 |    1 |     NULL |
|  200 |    2 |     NULL |
| NULL | NULL |      101 |
| NULL | NULL |      201 |
+------+------+----------+

相關推薦

MySQL資料插入資料

一、需求 有兩個表格,test和test2如下所示: mysql> select * from test; +------+------+------------+ | data | id | timestamp | +------+----

java 有的excel追加資料的新增】

/** * 向已有的工作表的追加資料 * @param exportFilePath * 伺服器上面的模版excel檔案 * @param list *

Django+MySQL同步存在的 實現增、刪、改、查

一、建立連線開啟專案settings.py,找到DATABASES字典。default預設使用的是sqlplite3,修改驅動為mysql。mysql預設埠號是3306,可通過命令檢視。name是要匯入的資料庫名稱mysql> show global variables

MySQL 一個條件查詢出資料所有滿足條件的資料的方法

專案開發中遇到一個問題:搜尋框只傳入一個條件,在SQL查詢的時候如何查詢出所有滿足條件的資料。想到的第一解決方案是在後端進行邏輯處理的時候進行 if...else...的拼接。 但是拼接多個if...else...也不過是權宜之計,假如新增欄位也不便於程式碼維護。查詢mys

mysql查詢的結果在新增作為排序使用 @row_num

// 在結果表後在加一列遞增一 作為排名使用 // 為了分頁的時候排名是在整體資料上進行排序而不是每一頁都是從1開始這個 @row_num應該是動態的 #{offset} 和limt #{offset} 一致 SET @row_num = 11; // 由於查詢的條件

oracle 編寫sql語句獲取的最後資料

select p.* from (select * from t_cfg_menu t order by t.menu_id desc) p where rownum = 1 首先查詢表中資料按降序排列,然後通過“rownum = 1”獲取第一條資料,即是原

資料隨機抽取n條資料的幾種方法

1、"SELECT * FROM table ORDER BY RAND() LIMIT n"; 2、"SELECT *, myrand as RAND() FROM table ORDER BY myrand LIMIT n"; 3、"SELECT * FROM tabl

mysql資料庫刪除某值重複的全部行和只留

如果沒有加上一個中間表t,即這句話 select t.id from去掉直接寫成delete from fatie where id not in(select max(id) a.id1 from fatie a group by a.name);mysql會提示錯誤:You can't specify t

mysql將一個的某複製到另外一個(聯更新,假如全部)

這是mysql的寫法,然後其他語言的,可以自行google 假如有表 table1 table1 id name 1 null 2 null 3 null 4 null table表2 id na

SQL如何將一個的某資料複製到另一個的某

表一: SPRD PRD_NO      SPC          001                NULL 002               NULL 003               NULL ...                    ... 表二

EXCEL怎麼將資料首尾倒置

這裡給大家介紹一下怎麼在excel中用OFFSET函式將一列資料首位倒置,結果放在新的位置上。   例1 1首先舉一個例子: 將單元格區域A1:A15的資料首尾倒置放在單元格區域B1:B15 如下圖所示效果 2在單元格B1中輸入公式: =OFF

sql語句將的某插入到另

如下兩張表student和course               現在想要將course表的cname列插入到student表中。(有兩種方法) 方法一: 語句如下: alter table stu

查詢Excel表格的某資料【Node.js實現】

const fs = require('fs') const xlsx = require('node-xlsx') const sheets = xlsx.parse('example.xlsx') sheets.forEach(sheet => { // 獲取整個excel

查詢出來的資料變為一行

DECLARE @STR VARCHAR(8000)  set @STR='' SELECT @[email protected]+ISNULL(',','')+rtrim(a1) FROM (SELECT DISTINCT(a1)    FROM Table

SQLSqlserver如何將資料拼接成一個字串

建立表值函式:create function [dbo].[GetAssessmentCity]( @ryear varchar(4), --年份 @rmonth varchar(2) --月份 ) returns @GetCity TABLE(id varchar(20

MySQL命令insert into插入資料(記錄)

insert into命令用於向表中插入資料。insert into命令格式:insert into <表名> [(<欄位名1>[,..<欄位名n > ])] va

MySQL資料怎麼給已經主鍵自增的加入資料

MySQL資料庫表中有自增主鍵ID,當用SQL插入語句中插入語句帶有ID列值記錄的時候; 如果指定了該列的值,則新插入的值不能和已有的值重複,而且必須大於其中最大的一個值; 也可以不指定該列的值,只將其他列的值插入,讓ID還是按照MySQL自增自己填 具體如下: cre

MySQL 使用while語句資料批量插入資料

1.建立一張資料表 mysql> create table test_while ( -> id int primary key) charset = utf8; Query OK, 0 rows affected (0.28 sec)  

sqlserver觸發器插入的事實值超過預警值則預警插入條預警資料

--建立insert插入型別觸發器 create trigger tgr_data_insert on DATA_RECORD_HISTORY for insert --插入觸發 as --定義變數 declare @tempValue int;

MySQL入門——修改資料2往指定的增多資料(欄位)

增加多列,多個列的定義與宣告需要用小括號括起來,每個欄位之間用逗號隔開。 例如,往user2表中一次性新增2三個欄位salary、sex、address欄位,寫法如下: ALTER TABLE