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...