MySQL資料庫如何新增列,mysql資料庫有資料怎麼新增欄位

2022-06-01 13:05:23 字數 5643 閱讀 7868

1樓:匿名使用者

alter table 表名 add 列名 屬性

一般用上邊的語法

但是如果有圖形化工具的話,也可以用圖形化工具,具體的得看你用的是什麼了,不過個人認為還是用語句方便一些

2樓:愛可生雲資料庫

傳統情況

我們先回顧一下,在沒有 "立刻加列" 功能時,加列操作是怎麼完成的。我們也藉此來熟悉一下本期的圖例:

當進行 加列操作 時,所有的資料行 都必須要 增加一段資料(圖中的 列 4 資料)

如上一期**所講,當改變資料行的長度,就需要 重建表空間(圖中灰藍的部分為發生變更的部分)

資料字典中的列定義也會被更新

以上操作的問題在於 每次加列 操作都需要重建表空間,這就需要大量 io以及大量的時間

立刻加列

"立刻加列" 的過程如下圖:

請點選輸入**描述

請點選輸入**描述

"立刻加列" 時,只會變更資料字典中的內容,包括:

在列定義中增加 新列的定義

增加 新列的預設值

"立刻加列" 後,當要讀取表中的資料時:

由於 "立刻加列" 沒有 變更行資料,讀取的行資料只有 3 列

mysql 會將 新增的第 4 列的預設值,追加到 讀取的資料後

以上過程描述了 如何讀取 在 "立刻加列" 之前寫入的資料,其實質是:在讀取資料的過程中,"偽造" 了一個新列出來

那麼如何讀取 在 "立刻加列" 之後 寫入的資料呢 ? 過程如下圖:

當讀取 行 4 時:

請點選輸入**描述

請點選輸入**描述

通過判斷 資料行的頭資訊中的instant 標誌位,可以知道該行的格式是 "新格式":該行頭資訊後有一個新欄位 "列數"

通過讀取 資料行的 "列數" 欄位,可以知道 該行資料中多少列有 "真實" 的資料,從而按列數讀取資料

通過上圖可以看到:讀取 在"立刻加列" 前/後寫入的資料是不同的流程

通過以上的討論,我們可以總結 "立刻加列" 之所以高效的原因是:

在執行 "立刻加列" 時,不變更資料行的結構

讀取 "舊" 資料時,"偽造" 新增的列,使結果正確

寫入 "新" 資料時,使用了新的資料格式(增加了instant標誌位 和 "列數" 欄位),以區分新舊資料

讀取 "新" 資料時,可以如實讀取資料

那麼 我們是否能一直 "偽造" 下去 ? "偽造" 何時會被拆穿 ?

考慮以下場景:

用 "立刻加列" 增加列 a

寫入資料行 1

用 "立刻加列" 增加列 b

寫入資料行 2

刪除列 b

我們推測一下 "刪除列 b" 的最小代價:需要修改 資料行中的instant標誌位或 "列數" 欄位,這至少會影響到 "立刻加列" 之後寫入的資料行,成本類似於重建資料

從以上推測可知:當出現 與 "立刻加列" 操作不相容 的 ddl 操作時,資料表需要進行重建,如下圖所示:

請點選輸入**描述

請點選輸入**描述

使用限制

在瞭解原理之後,我們來看看 "立刻加列" 的使用限制,就很容易能理解其中的前兩項:

"立刻加列" 的加列位置只能在表的最後,而不能加在其他列之間

在後設資料中,只記錄了 資料行 應有多少列,而沒有記錄 這些列 應出現的位置。所以無法實現指定列的位置

"立刻加列" 不能新增主鍵列

加列 不能涉及聚簇索引的變更,否則就變成了 "重建" 操作,不是 "立刻" 完成了

"立刻加列"不支援壓縮的**式

按照 wl 的說法:"compressed is no need to supported"(沒必要支援不怎麼用的格式)

總結回顧

我們總結一下上面的討論:

"立刻加列" 之所以高效的原因是:

在執行 "立刻加列" 時,不變更資料行的結構

讀取 "舊" 資料時,"偽造" 新增的列,使結果正確

寫入 "新" 資料時,使用了新的資料格式 (增加了 instant 標誌位 和 "列數" 欄位),以區分新舊資料

讀取 "新" 資料時,可以如實讀取資料

"立刻加列" 的 "偽造" 手法,不能一直維持下去。當發生 與 "立刻加列" 操作不相容 的 ddl 時,表資料就會發生重建

回到之前遺留的兩個問題:

"立刻加列" 是如何工作的 ?

我們已經解答了這個問題

所謂 "立刻加列" 是否完全不影響業務,是否是真正的 "立刻" 完成 ?

可以看到:就算是 "立刻加列",也需要變更 資料字典,那麼 該上的鎖還是逃不掉的。也就是說 這裡的 "立刻" 指的是 "不變更資料行的結構",而並非指 "零成本地完成任務"

mysql 資料庫如何新增列

3樓:愛可生雲資料庫

傳統情況

我們先回顧一下,在沒有 "立刻加列" 功能時,加列操作是怎麼完成的。我們也藉此來熟悉一下本期的圖例:

當進行 加列操作 時,所有的資料行 都必須要 增加一段資料(圖中的 列 4 資料)

如上一期**所講,當改變資料行的長度,就需要 重建表空間(圖中灰藍的部分為發生變更的部分)

資料字典中的列定義也會被更新

以上操作的問題在於 每次加列 操作都需要重建表空間,這就需要大量 io以及大量的時間

立刻加列

"立刻加列" 的過程如下圖:

請點選輸入**描述

請點選輸入**描述

"立刻加列" 時,只會變更資料字典中的內容,包括:

在列定義中增加 新列的定義

增加 新列的預設值

"立刻加列" 後,當要讀取表中的資料時:

由於 "立刻加列" 沒有 變更行資料,讀取的行資料只有 3 列

mysql 會將 新增的第 4 列的預設值,追加到 讀取的資料後

以上過程描述了 如何讀取 在 "立刻加列" 之前寫入的資料,其實質是:在讀取資料的過程中,"偽造" 了一個新列出來

那麼如何讀取 在 "立刻加列" 之後 寫入的資料呢 ? 過程如下圖:

當讀取 行 4 時:

請點選輸入**描述

請點選輸入**描述

通過判斷 資料行的頭資訊中的instant 標誌位,可以知道該行的格式是 "新格式":該行頭資訊後有一個新欄位 "列數"

通過讀取 資料行的 "列數" 欄位,可以知道 該行資料中多少列有 "真實" 的資料,從而按列數讀取資料

通過上圖可以看到:讀取 在"立刻加列" 前/後寫入的資料是不同的流程

通過以上的討論,我們可以總結 "立刻加列" 之所以高效的原因是:

在執行 "立刻加列" 時,不變更資料行的結構

讀取 "舊" 資料時,"偽造" 新增的列,使結果正確

寫入 "新" 資料時,使用了新的資料格式(增加了instant標誌位 和 "列數" 欄位),以區分新舊資料

讀取 "新" 資料時,可以如實讀取資料

那麼 我們是否能一直 "偽造" 下去 ? "偽造" 何時會被拆穿 ?

考慮以下場景:

用 "立刻加列" 增加列 a

寫入資料行 1

用 "立刻加列" 增加列 b

寫入資料行 2

刪除列 b

我們推測一下 "刪除列 b" 的最小代價:需要修改 資料行中的instant標誌位或 "列數" 欄位,這至少會影響到 "立刻加列" 之後寫入的資料行,成本類似於重建資料

從以上推測可知:當出現 與 "立刻加列" 操作不相容 的 ddl 操作時,資料表需要進行重建,如下圖所示:

請點選輸入**描述

請點選輸入**描述

使用限制

在瞭解原理之後,我們來看看 "立刻加列" 的使用限制,就很容易能理解其中的前兩項:

"立刻加列" 的加列位置只能在表的最後,而不能加在其他列之間

在後設資料中,只記錄了 資料行 應有多少列,而沒有記錄 這些列 應出現的位置。所以無法實現指定列的位置

"立刻加列" 不能新增主鍵列

加列 不能涉及聚簇索引的變更,否則就變成了 "重建" 操作,不是 "立刻" 完成了

"立刻加列"不支援壓縮的**式

按照 wl 的說法:"compressed is no need to supported"(沒必要支援不怎麼用的格式)

總結回顧

我們總結一下上面的討論:

"立刻加列" 之所以高效的原因是:

在執行 "立刻加列" 時,不變更資料行的結構

讀取 "舊" 資料時,"偽造" 新增的列,使結果正確

寫入 "新" 資料時,使用了新的資料格式 (增加了 instant 標誌位 和 "列數" 欄位),以區分新舊資料

讀取 "新" 資料時,可以如實讀取資料

"立刻加列" 的 "偽造" 手法,不能一直維持下去。當發生 與 "立刻加列" 操作不相容 的 ddl 時,表資料就會發生重建

回到之前遺留的兩個問題:

"立刻加列" 是如何工作的 ?

我們已經解答了這個問題

所謂 "立刻加列" 是否完全不影響業務,是否是真正的 "立刻" 完成 ?

可以看到:就算是 "立刻加列",也需要變更 資料字典,那麼 該上的鎖還是逃不掉的。也就是說 這裡的 "立刻" 指的是 "不變更資料行的結構",而並非指 "零成本地完成任務"

4樓:匿名使用者

alter table `users` add `username` text not null ,

add `password` text not null ,add `register_name ` text not null其中 text 表示欄位的資料型別是text;

not null 表示欄位不為空

mysql資料庫有資料怎麼新增欄位

5樓:陽光上的橋

例子sql(給表table1新增一個欄位transactor):

alter table table1 add transactor varchar(10) not null;

用j**a向mysql資料庫新增列的問題

6樓:匿名使用者

別使用pt2.setstring(1,「itema」);

用了後會加上引號 "alter table tb_main add column 'itema' int"

用字串拼接吧 "alter table tb_main add column "+"itema"+" int"

7樓:匿名使用者

試試不使用引數。

執行方法

executeupdate()

如何在mysql資料庫新增和修改欄位

8樓:淺色瞳

insert用於向一個已有的表中插入新行。insert…values語句根據明確指定的值插入行。讓我們先來看一下insert語句標準的定義,放在內的都是可以省略的:

insert [low_priority | delayed | high_priority] [ignore]

[into] tbl_name [(col_name,...)]

values (,...),(...),...

[ on duplicate key update col_name=expr, ... ]

這個語法是很簡單的,根據英語單詞的意思就可以直接翻譯過來:插入 表名(欄位1名,欄位2名) values (欄位1的值,欄位2的值);

如何在mysql資料庫中資料庫,如何在MYSQL資料庫中新建一個資料庫

1 開啟電腦的sql軟體 輸入使用者名稱和密碼,連線上mysql主機地址,將mysql啟動。2 進入mysql裡面後,用滑鼠右鍵點選主機,然後會彈出選單欄,點選裡面的 建立資料庫 也可以使用快捷鍵ctrl d。3 接著會出現 建立資料庫 的視窗,為建立的資料庫取名,並選擇 基字符集 為 utf 8 ...

MySQL資料庫如何鎖定和解鎖資料庫表

第一步,建立資料庫表writer和檢視錶結構,利用sql語句 create table writer wid int 10 wno int 10 wname varchar 20 w varchar 2 wage int 2 第二步,向資料庫表writer插入五條資料,專插入後檢視錶裡屬資料第三步,...

mysql資料庫怎麼匯入資料庫檔案

步驟如下 首先使用mysql提供的命令列介面來匯入資料庫,確保自己的電腦中安裝了mysql資料庫,可以通過命令列來確認是否安裝了mysql資料庫,當然,第一步是開啟mysql的資料庫服務,使用命令列來開啟 如下圖所示 啟動mysql後,找到需要用到的指令碼檔案,也就是資料庫檔案,首先得建立一個資料庫...