數(shù)據(jù)庫學(xué)習(xí)筆記——17創(chuàng)建和操縱表

從這節(jié)課開始柑蛇,主要結(jié)合《MySQL必知必會》學(xué)習(xí)

1 創(chuàng)建表

1.1 表創(chuàng)建基礎(chǔ)

為利用 CREATE TABLE 創(chuàng)建表孽鸡,必須給出下列信息:

  • 新表的名字,在關(guān)鍵字 CREATE TABLE 之后給出庇忌;
  • 表列的名字和定義磨镶,用逗號分隔。
CREATE TABLE customers(
cust_id INT NOT NULL auto_increment,
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;

1.2 使用NULL值

NULL 值就是沒有值或缺值急黎。允許 NULL 值的列也允許在插入行時不給出該列的值扎狱。不允許 NULL 值的列不接受該列沒有值的行,換句話說勃教,在插入或更新行時委乌,該列必須有值。

每個表列或者是 NULL 列荣回,或者是 NOT NULL 列遭贸,這種狀態(tài)在創(chuàng)建時由表的定義規(guī)定。請看下面的例子:

CREATE TABLE orders (
order_num INT NOT NULL auto_increment,
order_date datetime NOT NULL,
cust_id INT NOT null,
PRIMARY KEY (order_num)
)ENGINE = INNODB; 

每個列的定義都含有關(guān)鍵字 NOT NULL ,這將會阻止插入沒有值的列心软。如果試圖插入沒有值的列壕吹,將返回錯誤,且插入失敗删铃。
下一個例子將創(chuàng)建混合了 NULL 和 NOT NULL 列的表:

CREATE TABLE vendors (
vend_id INT NOT NULL 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;

供應(yīng)商ID和供應(yīng)商名字列是必需的耳贬,因此指定為 NOT NULL 。其余5個列全都允許 NULL 值猎唁,所以不指定NOT NULL 咒劲。 NULL 為默認(rèn)設(shè)置,如果不指定 NOT NULL 诫隅,則認(rèn)為指定的是 NULL 腐魂。

1.3指定默認(rèn)值

如果在插入行時沒有給出值,MySQL允許指定此時使用的默認(rèn)值逐纬。
默認(rèn)值用 CREATE TABLE 語句的列定義中的 DEFAULT 關(guān)鍵字指定蛔屹。

請看下面的例子:

CREATE TABLE orderitems (
order_num INT NOT NULL,
order_item INT NOT NULL,
prod_id CHAR(10) NOT NULL,
quantity INT NOT NULL DEFAULT 1,
item_price DECIMAL(8,2) NOT NULL,
PRIMARY KEY (order_num,order_item)
)ENGINE=INNODB;

這條語句創(chuàng)建包含組成訂單的各物品的 orderitems 表(訂單本身存儲在 orders 表中)。 quantity 列包含訂單中每項(xiàng)物品的數(shù)量豁生。在此例子中兔毒,給該列的描述添加文本 DEFAULT 1 指示MySQL,在未給出數(shù)量的情況下使用數(shù)量 1 甸箱。

不允許函數(shù)
與大多數(shù)DBMS不一樣育叁,MySQL不允許使用函數(shù)作為默認(rèn)值,它只支持常量芍殖。

使用默認(rèn)值而不是 NULL 值
許多數(shù)據(jù)庫開發(fā)人員使用默認(rèn)值而不是 NULL 列豪嗽,特別是對用于計(jì)算或數(shù)據(jù)分組的列更是如此。

1.4 引擎類型

你可能已經(jīng)注意到,迄今為止使用的 CREATE TABLE 語句全都以ENGINE=InnoDB 語句結(jié)束昵骤。
與其他DBMS一樣,MySQL有一個具體管理和處理數(shù)據(jù)的內(nèi)部引擎肯适。在你使用 CREATE TABLE 語句時变秦,該引擎具體創(chuàng)建表,而在你使用 SELECT語句或進(jìn)行其他數(shù)據(jù)庫處理時框舔,該引擎在內(nèi)部處理你的請求蹦玫。多數(shù)時候,此引擎都隱藏在DBMS內(nèi)刘绣,不需要過多關(guān)注它樱溉。
但MySQL與其他DBMS不一樣,它具有多種引擎纬凤。它打包多個引擎福贞,這些引擎都隱藏在MySQL服務(wù)器內(nèi),全都能執(zhí)行 CREATE TABLE 和 SELECT等命令停士。
為什么要發(fā)行多種引擎呢挖帘?因?yàn)樗鼈兙哂懈髯圆煌墓δ芎吞匦裕瑸椴煌娜蝿?wù)選擇正確的引擎能獲得良好的功能和靈活性恋技。
當(dāng)然拇舀,你完全可以忽略這些數(shù)據(jù)庫引擎。如果省略 ENGINE= 語句蜻底,則使用默認(rèn)引擎(很可能是 MyISAM )骄崩,多數(shù)SQL語句都會默認(rèn)使用它。但并不是所有語句都默認(rèn)使用它薄辅,這就是為什么 ENGINE= 語句很重要的原因要拂。
以下是幾個需要知道的引擎:

  • InnoDB 是一個可靠的事務(wù)處理引擎,它不支持全文本搜索站楚;
  • MEMORY 在功能等同于 MyISAM 宇弛,但由于數(shù)據(jù)存儲在內(nèi)存(不是磁盤)中,速度很快(特別適合于臨時表)源请;
  • MyISAM 是一個性能極高的引擎枪芒,它支持全文本搜索,但不支持事務(wù)處理谁尸。

外鍵不能跨引擎
混用引擎類型有一個大缺陷舅踪。外鍵(用于強(qiáng)制實(shí)施引用完整性)不能跨引擎,即使用一個引擎的表不能引用具有使用不同引擎的表的外鍵良蛮。

2 更新表

為更新表定義抽碌,可使用 ALTER TABLE 語句。

為了使用 ALTER TABLE 更改表結(jié)構(gòu),必須給出下面的信息:

  • 在 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 orderitems ADD CONSTRAINT fk_orderitems_products FOREIGN KEY (prod_id) REFERENCES products(prod_id);
ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (cust_id) REFERENCES customers(cust_id);
ALTER TABLE products ADD CONSTRAINT fk_products_vendors FOREIGN KEY (vend_id) REFERENCES vendors(vend_id);

復(fù)雜的表結(jié)構(gòu)更改一般需要手動刪除過程赏迟,它涉及以下步驟:

  • 用新的列布局創(chuàng)建一個新表;
  • 使用 INSERT SELECT 語句從舊表復(fù)制數(shù)據(jù)到新表蠢棱。如果有必要锌杀,可使用轉(zhuǎn)換函數(shù)和計(jì)算字段;
  • 檢驗(yàn)包含所需數(shù)據(jù)的新表泻仙;
  • 重命名舊表(如果確定糕再,可以刪除它);
  • 用舊表原來的名字重命名新表玉转;
  • 根據(jù)需要突想,重新創(chuàng)建觸發(fā)器、存儲過程究抓、索引和外鍵蒿柳。

3 刪除表

DROP TABLE custcopy;

4 重命名表

使用 RENAME TABLE 語句可以重命名一個表:

RENAME TABLE custnew TO customers2;

RENAME TABLE 所做的僅是重命名一個表′鲶。可以使用下面的語句對多個表重命名:


alter.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垒探,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子怠李,更是在濱河造成了極大的恐慌圾叼,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捺癞,死亡現(xiàn)場離奇詭異夷蚊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)髓介,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門惕鼓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唐础,你說我怎么就攤上這事箱歧。” “怎么了一膨?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵呀邢,是天一觀的道長。 經(jīng)常有香客問我豹绪,道長价淌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蝉衣,結(jié)果婚禮上括尸,老公的妹妹穿的比我還像新娘。我一直安慰自己病毡,他們只是感情好濒翻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剪验,像睡著了一般。 火紅的嫁衣襯著肌膚如雪前联。 梳的紋絲不亂的頭發(fā)上功戚,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音似嗤,去河邊找鬼啸臀。 笑死,一個胖子當(dāng)著我的面吹牛烁落,可吹牛的內(nèi)容都是我干的乘粒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼伤塌,長吁一口氣:“原來是場噩夢啊……” “哼灯萍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起每聪,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤旦棉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后药薯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绑洛,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年童本,在試婚紗的時候發(fā)現(xiàn)自己被綠了真屯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡穷娱,死狀恐怖绑蔫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泵额,我是刑警寧澤晾匠,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站梯刚,受9級特大地震影響凉馆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一澜共、第九天 我趴在偏房一處隱蔽的房頂上張望向叉。 院中可真熱鬧,春花似錦嗦董、人聲如沸母谎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奇唤。三九已至,卻和暖如春匹摇,著一層夾襖步出監(jiān)牢的瞬間咬扇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工廊勃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留懈贺,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓坡垫,卻偏偏與公主長得像梭灿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冰悠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354