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