MySQL必知必會二十一 建立和操縱表

2021-10-07 04:50:28 字數 4730 閱讀 5885

mysql不僅用於表資料操縱,而且還可以用來執行資料庫和表的所有操作,包括表本身的建立和處理。

為利用create table建立表,必須給出下列資訊:

create table語句也可能會包括其他關鍵字或選項,但至少要包括表的名字和列的細節。下面的mysql語句建立本書中所用的customers表:

create

table customers(

cust_id int

notnull auto_increament,

cust_name char(50

)not

null

, cust_address char(50

)null

, cust_city char(50

)null

, cust_state char(5

)null

, cust_zip char(10

)null

, cust_country char(50

)null

, cust_contact char(50

)null

, cust_email char

(255

)null

,primary

key(cust_id)

)engine

=innodb

;

處理現有的表在建立新錶時,指定的表名必須不存在,否則將出錯。如果要防止意外覆蓋已有的表, sql要求首先手工刪除該錶(請參閱後面的小節),然後再重建它,而不是簡單地用建立表語句覆蓋它。如果你僅想在乙個表不存在時建立它,應該在表名後給出if not exists。這樣做不檢查已有表的模式是否與你打算建立的表模式相匹配。它只是檢視表名是否存在,並且僅在表名不存在時建立它。

null值就是沒有值或缺值。允許null值的列也允許在插入行時不給出該列的值。不允許null值的列不接受該列沒有值的行,換句話說,在插入或更新行時,該列必須有值。

每個表列或者是null列,或者是not null列,這種狀態在建立時由表的定義規定。請看下面的例子:

create

table orders

( order_num int

notnull auto_increament,

order_date datetime

notnull

, cust_id int

notnull

,primary

key(order_num)

)engine

=innodb

;

create

table vendors

( vend_id int

notnull

auto_increment

, vend_name char(50

)not

null

, vend_address char(50

)null

, vend_city char(50

)null

, vend_state char(5

)null

, vend_zip char(10

)null

, vend_country char(50

)null

,primary

key(vend_id)

)engine

=innodb

;

理解null不要把null值與空串相混淆。 null值是沒有值,它不是空串。如果指定』』(兩個單引號,其間沒有字元),這在not null列中是允許的。空串是乙個有效的值,它不是無值。 null值用關鍵字null而不是空串指定。

正如所述,主鍵值必須唯一。即,表中的每個行必須具有唯一的主鍵值。如果主鍵使用單個列,則它的值必須唯一。如果使用多個列,則這些列的組合值必須唯一。

迄今為止我們看到的create table例子都是用單個列作為主鍵。其中主鍵用以下的類似的語句定義:primary key(vend_id)

為建立由多個列組成的主鍵,應該以逗號分隔的列表給出各列名,如下所示:

create

table orderitems

( order_num int

notnull

, order_item int

notnull

, prod_id char(10

)not

null

, quantity int

notnull

, item_price decimal(8

,2)not

null

,primary

key(order_num, order_item)

)engine

=innodb

;

主鍵和null值,主鍵為其值唯一標識表中每個行的列。主鍵中只能使用不允許null值的列。允許null值的列不能作為唯一標識。

auto_increment告訴mysql,本列每當增加一行時自動增量。每次執行乙個insert操作時, mysql自動對該列增量(從而才有這個關鍵字auto_increment),給該列賦予下乙個可用的值。這樣給每個行分配乙個唯一的cust_id,從而可以用作主鍵值。

每個表只允許乙個auto_increment列,而且它必須被索引(如,通過使它成為主鍵)。

如果在插入行時沒有給出值, mysql允許指定此時使用的預設值。

預設值用create table語句的列定義中的default關鍵字指定。

create

table orderitems

( order_num int

notnull

, order_item int

notnull

, prod_id char(10

)not

null

, quantity int

notnull

default1,

item_price decimal(8

,2)not

null

,primary

key(order_num, order_item)

)engine

=innodb

;

如果省略engine=語句,則使用預設引擎(很可能是myisam),多數sql語句都會預設使用它。但並不是所有語句都預設使用它,這就是為什麼engine=語句很重要的原因(也就是為什麼本書的樣列表中使用兩種引擎的原因)。以下是幾個需要知道的引擎:

引擎型別可以混用。除productnotes表使用myisam外,本書中的樣例表都使用innodb。 原因是作者希望支援事務處理(因此,使用innodb),但也需要在productnotes中支援全文本搜尋(因此,使用myisam)。

外來鍵不能跨引擎 混用引擎型別有乙個大缺陷。外來鍵不能跨引擎,即使用一

個引擎的表不能引用具有使用不同引擎的表的外來鍵。

myisam由於其效能和特性可能是最受歡迎的引擎。但如果你不需要可靠的事務處理,可以使用其他引擎。

為更新表定義,可使用alter table語句。但是,理想狀態下,當表中儲存資料以後,該錶就不應該再被更新。在表的設計過程中需要花費大量時間來考慮,以便後期不對該錶進行大的改動。

為了使用alter table更改表結構,必須給出下面的資訊:

下面的例子給表新增乙個列:

alter

table vendors add vend_phone char(20

);

刪除剛剛新增的列,可以這樣做:

alter

table vendors drop

column vend_phone;

alter table的一種常見用途是定義外來鍵。下面是用來定義本書中的表所用的外來鍵的**:

alter

table orderitems add

constraint fk_orderitems_orders foreign

key(order_num)

references orders(order_num)

;

複雜的表結構更改一般需要手動刪除過程,它涉及以下步驟:

小心使用alter table使用alter table要極為小心,應該在進行改動前做乙個完整的備份(模式和資料的備份)。資料庫表的更改不能撤銷,如果增加了不需要的列,可能不能刪除它們。類似地,如果刪除了不應該刪除的列,可能會丟失該列中的所有資料。

刪除表(刪除整個表而不是其內容)非常簡單,使用drop table語句即可:

drop

table customers2;

使用rename table語句可以重新命名乙個表:

rename

table customers2 to customers;

SQL必知必會筆記二十一(使用游標)

sql檢索操作返回一組稱為結果集的行,這組返回的行都是與sql語句相匹配的行 零行或多行 簡單地使用select語句,沒有辦法得到第一行 下一行或前10行。但這是關係dbms功能的組成部分。結果集 result set sql查詢所檢索出的結果。有時,需要在檢索出來的行中前進或後退一行或多行,這就是...

mysql必知必會 mysql必知必會(四)

十四 理解子查詢 1 通過子查詢過濾 這本書在所有的章節都關連到了資料庫表,訂單資料是儲存在兩個表中,orders表儲存著 訂單號碼 顧客id和訂單日期。個人的訂單列表關連著orderitems表,訂單表沒有儲存顧客資訊,它只是儲存著顧客id,這實際的顧客資訊是儲存在customers表中。現在假設...

SQL必知必會 建立和操縱表

sql必知必會 讀書筆記 1.建立表 一般有兩種建立表的方法 2.表建立基礎 利用create table建立表,必須給出下列資訊 create table products prod id char 10 not null,vend id char 10 not null,prod name ch...