【數據庫知識掃描】 | SQL複習-中篇 第17課 創建和操縱表

今日清明,爲留在這個冬天不再隨着時光前進的各位默哀三分鐘。

爲了避免又是一個夜裏更新的博文,這裏在憂慮各種突發情況後開始動手跟今天的課程,預期兩課,具體得看兩篇長度以及狀態。所以今天主要講的是表的創建和操縱(操作),也就是對於表從創建到銷燬的一些操作。

目錄

17.1 創建表

① 表創建基礎

② 使用NULL值

③ 指定默認值

17.2 更新表

17.3 刪除表

17.4 重命名錶


17.1 創建表

從創建講起,也有兩種,一種是使用交互式創建和管理數據庫表的工具;第二種就是直接用SQL語句完成了。

用程序創建表,可以使用CREATE TABLE語句,不同DBMS支持不同語法,具體參考文檔說明。

① 表創建基礎

使用CREATE TABLE語句的話,需要給出:新表的名稱,跟着關鍵字“CREATE TABLE”後;表列名字及其定義,用逗號分離;部門DBMS要求指定表的位置。

那麼我們做個小練習,比如創建產品Products表(因爲之前創建過products表,所以這裏爲了區分開,使用promult):

CREATE TABLE Product(
    -> prod_id CHAR(10) NOT NULL,
    -> vend_id CHAR(10) NOT NULL,
    -> prod_name CHAR(254) NOT NULL,
    -> prod_price DECIMAL(8,2) NOT NULL,
    -> prod_desc VARCHAR(1000) NULL );

新增的表格和原有的表格,再來看一下上面的語法,各列之間用逗號分隔,後跟數據類型,用括號包裹住跟在表名後。

這裏需要註明一點,建表語法不同DBMS略有差異,尤其是在數據類型約束方面,比如MySQL中varchar替換成text之類的,針對不同的DBMS,最好編寫不同的表創建腳本。

(說到腳本,之前一直以爲服務器那種Linux系統上編寫的程序才叫做腳本,還是不夠熟悉啊,數據庫,一通百通!加油補網哇~領悟計算機的魅力吧~

提到兩個小問題,語句格式化的和替換現有表,前者主要是指多行單行沒有區別,會忽略空格,適當縮進只是便於閱讀編輯,就像之前的代碼都是直接用的一行,其實編寫時候用的回車區別,粘過來的時候去掉了分行“->”標識,上面這條就沒有刪掉,注意粘貼的時候去掉前面的部分,不然可能沒辦法識別;後者替換現有表的問題,基於創建新表時,同表名的表不存在,不然就有問題啊,比如會覆蓋已有的表,記錄也會被清掉,所以SQL要求先手工刪除該表再重建,而不是直接用創建覆蓋這種騷操作。

② 使用NULL值

學習這個部分之前,我們回顧一下NULL就是嗎,沒有值或缺值,那麼允許NULL也就允許插入行時不給出該行的值,而那些不允許NULL值的列就不會接受沒有列值的行,插入或更新時,該列不爲空。這個和做人某方面驚人的相似,如果你不設底線的話,那麼別人越過雷池讓你不舒服了,你沒有辦法去指責別人也更容易受到不公平的對待,而恰恰相反的是,那些一開始就明確自己底線和原則的人,反而得到了很好妥善的對待,明確自我,加強自身建設。

接下來,我們走個例子看看,說明一下,每個表列要麼是NULL列,要麼是NOT NULL列,在創建時表定義給出:

書上的例子分別創建了訂單Orders表、供應商Vendors表:

一個是全非空的要求,一個是混合了NULL和NOT NULL的,有同學奇怪了,分明截圖是空白要求啊,對啊,不指定的話,就是默認設置,NULL就是默認設置,不指定NOT NULL就會被認爲是不修改設置。

另外,比較重要的是,如果設置了非空,插入數據列仍然爲空,就會失敗,這個要強調。

然後補充三個問題,第一個默認設置爲NULL的問題,還是不同DBMS的語法問題,大部分是這樣,不能確定的話還是查下文檔;第二個是主鍵和NULL值,它們兩個條件是不能一起的,比如主鍵不可以爲NULL,NULL列不可以爲主鍵!再就是NULL自己的問題,要理解它不是一個空字符串啊(前面博文也有提到,空字符串是個' '),在NOT NULL列允許這樣子的是有效值,並不是NULL的無值。

③ 指定默認值

默認值就是不指定的話,就給你分配這個值。在創建部分,用關鍵字DEFAULT指定。

要走個例子,但是這個創建表吼,真的比較複雜,所以這部分的代碼,我就直接截書上樣例圖了。

方框圈住的部門就是默認值的設置。

然後需要注意的地方是:默認值經常用於日期或時間戳列。提個MySQL的指定DEFAULT CURRENT_DATE() 指定引用系統日期的函數或變量,將系統日期用作默認日期。然後給個類似的對照,看看大傢伙都是怎麼做的:

這個地方對默認進行了一個補充,許多DBA傾向用DEFAULT值而不是NULL列,尤其是那些計算或數據分組的列。

17.2 更新表

講完上面的新增,終於講到更新,這裏用的ALTER TABLE語句,所有的DBMS都支持,但是允許更新的內容差別還是蠻大的。需要考慮比較多的問題,比如:

□ 理想情況下,不要在表中包含數據時對其進行更新。在表的設計過程中充分考慮可能的需求,避免今後對錶的結構做大改動。

□ 所有的DBMS都允許給現有的表增加列,不過對所增加列的數據類型(以及NULL和DEFAULT的使用)有所限制。

□ 許多DBMS不允許刪除或更改表中的列。

□ 多數DBMS允許重新命名錶中的列。

□ 許多DBMS限制對已經填有數據的列進行更改,對未填有數據的列幾乎沒有限制。

說真的,學習過程中,注意不同DBMS的特例,部分,有些,許多這些概括詞,確實太難了。但是對於複習者來說,既要把握住大概的學習,又得從細枝末節中注意到這些不同,這就是大魚不能跑,蝦米別漏liao。

而是用ALTER TABLE更改表結構,還得給出一些必要信息,比如,給個表名,改人家,人家總得在吧,所以只能對已存在的表進行修改,還有就是改造之前得知道哪些地方要改,不然目標不清晰也不行。

講了這麼久,走個實例,畢竟修改表結構還是可以的:

ALTER TABLE Vendors ADD vend_phone CHAR(20);

複雜表結構修改很麻煩,一般需要手動刪除過程,有這樣一些步驟,先用新的列布局創建一個新表;

再使用INSERT SELECT語句(關於這條語句的詳細介紹,請參閱第15課)從舊錶複製數據到新表。有必要的話,可以使用轉換函數和計算字段;之後再檢驗包含所需數據的新表;

還需要 重命名舊錶(如果確定,可以刪除它);加上用舊錶原來的名字重命名新表;最後根據需要,重新創建觸發器、存儲過程、索引和外鍵。

使用修改操作之前,要當心!改動前做好備份!因爲數據庫的更改是不能撤銷的,如果增加不需要的列,也許就無法刪除它們。

17.3 刪除表

講刪除就很簡單了,使用DROP TABLE語句,永久刪除。

關係規則的問題,許多DBMS允許強制實施有關規則,防止刪除與其他表相關聯的表,能防止意外發生。

17.4 重命名錶

重命名的支持不同,所以就不做嚴格要求了,提一下MySQL的,使用RENAME語句,基本語法就是指定舊錶名和新表名。具體參閱自己文檔。

於是今天的課就到這裏了,說了一萬遍不想熬夜不想零點以後結束學習,又拖到了現在,這是一個非常不好的習慣。

總之呢,今天學到的幾個語句都非常重要!!!用起來需要謹慎,最好在備份後使用,而擴展用法在文檔中應該比較詳細,菜菜就不多說了。

還是那句老話!刻意練習,每日精進!衝啊~ 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章