今日清明,爲留在這個冬天不再隨着時光前進的各位默哀三分鐘。
爲了避免又是一個夜裏更新的博文,這裏在憂慮各種突發情況後開始動手跟今天的課程,預期兩課,具體得看兩篇長度以及狀態。所以今天主要講的是表的創建和操縱(操作),也就是對於表從創建到銷燬的一些操作。
目錄
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語句,基本語法就是指定舊錶名和新表名。具體參閱自己文檔。
於是今天的課就到這裏了,說了一萬遍不想熬夜不想零點以後結束學習,又拖到了現在,這是一個非常不好的習慣。
總之呢,今天學到的幾個語句都非常重要!!!用起來需要謹慎,最好在備份後使用,而擴展用法在文檔中應該比較詳細,菜菜就不多說了。
還是那句老話!刻意練習,每日精進!衝啊~