昨天同事遇到乙個有關約束的問題. 其他同事設定了2個資料庫,其中乙個是從另外乙個exp/imp的,但不知什麼原因,
現在2個資料庫的使用者下表的約束存在很多不同. 他就問我有什麼方法將原庫的約束匯出來,然後重新在新的資料庫中
建立. 當然最簡單的方法是使用exp重新匯出原來資料庫的結構資訊,然後匯入新資料庫就可以了.
問題是他的客戶端是11g,而資料庫是10g,而且他工作的機器沒有pl/sql developer.
首先想到使用sql查詢dba_constraints來生成所需要的東西比較麻煩,能否用dbms_metadata包中提供的過程來獲取,
get_ddl只是獲取表的ddl定義,當然也包含了約束,但不是單獨的約束,查了一下手冊,dbms_metadata.get_dependent_ddl
可以獲取我們需要的資訊. 實驗表明方法可行,記錄下來供以後參考.
處理主鍵,唯一和檢查約束
select dbms_metadata.get_dependent_ddl('constraint',table_name,owner)
from dba_constraints a
where a.owner='***x'
and a.constraint_type not in ('r','?','o')
group by a.owner,a.table_name;
處理外來鍵約束.
select dbms_metadata.get_dependent_ddl('ref_constraint',table_name,owner)
from dba_constraints a
where a.owner= '***x'
and a.constraint_type='r'
group by a.owner,a.table_name;
當時有趣的是同事開始執行時說報錯,提示對應的constraint型別不存在,
按照我這裡的試驗告訴他
這個錯誤表示對應的表上不存在此約束,
進一步檢查,竟然發現約束的型別存在?和o,我也很驚奇,在我的記憶裡約束型別僅有p,u,c,r
四種型別, ?和o是什麼.連到乙個資料庫中,一看?和o對應的表,猜測與高階佇列有關.
所以修改來查詢語句將這種情況排除在外.
DDL語句 刪除表
刪除表是指刪除資料庫中已經存在的表。刪除表時,會刪除表中的所有資料。因此,我們在刪除表的時候要特別小心。mysql中通過drop table語句來刪除表。由於建立表時可能存在外來鍵約束,一些表成為了與之關聯的表的父類。要刪除這些表,情況還有點複雜,因為不能直接刪除。ok,這篇部落格我在這裡詳細的整理...
DDL語句(三) 表的管理
一 建立表 語法 create table if not exists 表名 欄位名 字段型別 約束 欄位名 字段型別 約束 欄位名 字段型別 約束 二 修改表 1 新增列 alter table 表名 add column 列名 型別 first after 欄位名 2 修改列的型別或約束 alt...
oracle語句管理表 DDL
學習oracle的語句管理之前,我們需要了解oracle的體系結構 oracle database 資料庫是由 資料庫 例項組成 從概念上來看,例項是暫時的,它不過是一組邏輯劃分的記憶體結構和程序結構,例項會隨著程序的關閉而關閉,但是資料庫不一樣,資料庫是一堆物理檔案,資料庫是永久存在磁碟上的 除非...