色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

用SQL創建表限制年齡

劉柏宏2年前96瀏覽0評論

用SQL創建表限制年齡?

在Oracle數據庫中,可以利用Create Table語句中嵌套子查詢來實現基于已有的表或者視圖來創建新表。這個功能可能對于大部分用戶來說,不會感到陌生。但是在使用這個語句的過程中,需要遵循哪些限制條件呢?對于這一點,可能不少數據庫管理員沒有一個清晰的認識。

為此,筆者就在這里給大家總結一下,利用查詢來創建表時需要遵守的一些限制。

限制條件一:不能夠改變數據類型與長度。

在利用子查詢來創建新表的時候,數據庫管理員可以修改新表中列的名稱,但是不能夠修改列的數據類型和長度。新表中所有列的數據類型和長度必須與查詢列一致。

如數據庫管理員從一個員工信息表中獲取員工姓名、員工出生日期等信息創建一個新表。如果在員工信息表中員工出生日期是一個日期型的字段,那么在新表中就必須也是日期型的數據類型。在創建新表的過程中,數據庫管理員不能夠修改數據類型。

那么如果系統管理員需要更改數據類型,如想把日期型的數據調整為字符型的數據,難道就沒有其他辦法了嗎?其實,通過一些其他方法,這個需求仍然可以實現。

上面的限制條件說,新表中的數據類型必須與查詢列中的數據類型相同,而不是說跟基表中的數據類型相同。為此如果數據庫管理員想要把日期型的數據(基表中的數據類型)調整為字符型的數據類型(新表中的數據類型),那么只需要在查詢語句中,利用日期字符轉換函數,將日期型的數據轉換為字符型的數據即可。

在創建新表時,數據類型是以查詢列為準,而不是以基表中列的數據類型為準。所以通過在查詢語句中使用數據類型轉換函數,就可以改變新表中的數據類型。

限制條件二:不能夠復制約束條件與列的默認值。

在基表中,可能某些字段有約束條件,如唯一性約束等等。

某些字段也可能設置了默認值,如系統的當前時間等等。但是,如果利用子查詢來創建信標的話,那么這些字段的約束條件、默認值等等都不會在新表中體現出來。也就是說,這些內容需要數據庫管理員在新表創建后手工重新建立。如果有需要的話,要對照基表的約束條件與默認值,分別在新表的字段中進行定義。

這個沒有取巧的方法。至少到限制為止,筆者還沒有找到可以利用其他方法來突破這個限制。為此數據庫管理員在利用子查詢來創建這個新表的時候,要特別注意這個約束條件。特別是默認值,不少管理員在利用這個方法創建新表后,會忘記重新設置相關列的默認值。

限制條件三:不能夠為新表指定表空間。

在正常情況下,利用Create創建表的時候,數據庫管理員可以為表指定其所屬的表空間。如果不指定的話,則其默認情況下采用的是當前用戶的默認表空間。但是在使用查詢來創建新表的時候,在語句中不能夠為新表指定表空間。如使用TableSpace關鍵字為其指定表空間的話,則系統會提示錯誤信息:SQL命令未正確結束。

注意這并不是說這個SQL語句哪里有問題,而是指不能夠在這種方式下為新表指定表空間。從這里也可以看出,Oracle數據庫系統的錯誤提示還是有模棱兩可的地方,還需要改進,即錯誤信息要能夠反映出真實的問題所在。因為不能夠為新表指定表空間,此時其所屬的表空間就是執行這條語句的用戶的默認表空間。

那么數據庫管理員就可以通過采用不同的用戶來為新表指定所屬的表空間。如現在數據庫管理員要想把這個新表放置在sales表空間下。那么就可以新建一個用戶或者利用原有的用戶,先把這個用戶的默認表空間設置為sales。然后再利用這個用戶來執行這條語句(必要的時候可能需要調整這個用戶的權限)。

通過這種方式就可以控制這種形式創建新表所屬的表空間。俗話說,條條道路通羅馬。既然不能夠利用直接的方式來為這新表設定表空間,那么就只能夠采取這曲線救國的方法了。只要最終能夠達到預計的目的就好。

限制條件四:某些數據類型的數據不能夠導入。

如果在查詢結果中,帶有大對象數據類型或者Long數據類型的數據,則這個語句就會執行不成功。

換句話說,如果采用子查詢來創建新表,則在Select語句中就不能夠包含大對象數據類型或者Long數據類型。這是Oracle數據庫的一種強制性規定。如果確實需要這些數據的話,則可以采用其它的方式來解決。如先不導入這些類型的數據。先利用子查詢把表建立起來。

等新表建立完成后。再利用Update關鍵字結合子查詢來更新這些列的數據即可。雖然這么操作比較麻煩一點,但是總比不能夠實現要好。

在使用這種方法創建新表時,除了要注意上面這些限制條件之外,最好再掌握下面這些技巧。這有助于提高通過查詢來創建新表的利用價值。

技巧一:使用Nologging選項提高建表效率。

Nologging這個可選項相信大部分數據庫管理員都知道其作用。但是到真的需要用到這個選項時,很多人就忘記了。這個選項主要是用來控制重做日志的。即在對數據庫進行相關的操作時,是否需要日志文件中寫入相關的記錄。

因為日志文件是一把雙刃劍。一方面王日志文件中記錄所有的操作,有利于數據庫的安全。當出現一些錯誤的操作時,可以通過恢復事務日志挽回損失。另一方面,由于數據庫同時需要更新數據、更新事務日志信息,為此當對數據庫進行大批量的操作時,就會降低這個操作的性能,延長時間。

通過查詢來創建新表是也遇到了類似的問題。因為在利用子查詢創建新表時,如果不采用這個選項的話,則在新表中每插入一條記錄都將會產生重做日志信息,這會占用額外的空間與時間。如果插入的記錄比較多的話,這會給數據庫的正常運行帶來很大的負面影響。在大部分情況下,筆者建議使用Nologging選項來節省創建新表的時間。

因為通過子查詢來創建新表,基本上不會對基表的內容產生任何不利的影響。所以即使不用重做日志,也不會帶來多大的風險。換句話話說,此時投入與產出不成正比。也就是說,此時犧牲性能,來換取所謂的安全,是不值得的。因為不影響其它表的數據,所以風險基本上就談不上。

在這種情況下,采用Nologging選項,讓數據庫在創建記錄的時候,不往事務日志中記錄信息,以縮短創建新表的時間。筆者認為這是非常明智的做法。

技巧二:利用查詢來創建表結構,不導入數據。

有時候我們需要復制表的結構,而不需要復制數據。在PL Developer開發工具中,可以直接復制某張表。

但是這么操作的話,除了會復制表的結構外,還會把相關的數據都復制過去。顯然,這不符合我們的要求。而表中的紀錄比較多的時候,這個復制作業就會占用比較長的時間與數據庫服務器的資源,會給數據庫的性能帶來不利的影響。那么是否有方法,可以只復制表的結構,而不導入任何數據呢?

在談這個解決方案之前,大家先來回顧一下Select語句。

在使用Select語句中,可以帶Where條件語句。如果要查詢的記錄沒有一條記錄符合Where條件中規定的限制條件時,則在顯示窗口,仍然會顯示要查詢的各個列的名稱。但是不會顯示任何一條記錄。現在要復制表的結構,而不需要導入任何數據,就可以參考這種實現機制來完成。

其實要實現這個需求的話,數據庫管理員就可以利用通過查詢來創建新表的方法。如先利用Select語句將相關的列等結構查詢出來,然后再在Where查詢語句中,設置一些根本不存在的條件。如此的話,最終的新表中就只有表的結構,而沒有任何基礎表中的紀錄。

可見,雖然通過子查詢來創建新表是一項比較強大的功能,可以實現一些復雜的管理需求。但是在使用這個功能的時候,上面對這些限制條件數據庫管理員要銘記在心。否則的話,很可能在使用這項功能的時候,四處碰壁;或者最后竹籃子打水一場空。

css年齡限制,用SQL創建表限制年齡