SQL DDL

DDL

建立資料表
create table < tablename>(
< column> < datatype> [column constraint],
[other constraint]
)

datatype常用的有以下
 varchar 變動欄位,依資料量多少會給不同的空間
 char 固定欄位
column constraint常用的有以下
 default 0 若無資料預設為0
 not null 資料不可為空值
 primary key 設定主鍵
 reference table(column) 設定外來鍵
 check(條件) 設定輸入資料的欄位限制
other constraint常用的有以下
 primary key(< column>) 設定主鍵
 foreign key(column) references table(column) 設定外來鍵
 check(條件) 設定輸入資料的欄位限制
ex:
column1和column2不可同時為null
check(column1 is not null or column2 is not null)
ex:
column1資料要大於0
check(column1 > 0)

設定主鍵
有以下2種寫法
< column> < datetype> primary key
 常用,寫在column constraint區域
 指定該欄位為primay key,缺點是只可以設定一個欄位
[option] primary key(< column>)
 寫在other constraint區域
 宣告primary key是那些欄位,可以設定多個欄位
 option包括
  constraint < name> 指定constraint名稱,也就是key編號的名稱

ex:
建立資料表department(dname,dnumber,mgr_ssn,mgr_start_date),語法大致如下
create table department
(
dname varchar(20),
dnumber char(1) primary key not null,
mgr_ssn char(8) ,
mgr_start_date varchar(20)
)

…..

定義資料表限制
在主鍵資料變動時,外來鍵的處理

新增資料時可能違反的限制有
 實體限制
 定義域限制
 參考完整性限制
 使用者定義
解決方式
 Restrict:拒絕新增

刪除資料時可能違反的限制有
 參考完整性限制
解決方式
 Restrict:拒絕刪除
 Delete Cascade:連鎖性刪除
 Set to Null Value: 將參考到被刪除紀錄之外來鍵值設成空值

更新資料時可能違反的限制有
 實體限制(只有主鍵或外來鍵才有可能違反該項目)
 定義域限制
 參考完整性限制(只有主鍵或外來鍵才有可能違反該項目)
 使用者定義
解決方式
 Restrict:拒絕更新
 Update Cascade:連鎖性更新
 Set to Null Value:將參考不到父資料表的外來鍵值設為空值

…….

設定外來鍵
有以下2種寫法
< column> < datetype> references table(column) [option]
 寫在column constraint區域
foreign key(column) references table(column) [option]
 寫在other constraint區域
option包括
on < delete|update> cascade 用在forigen key可產生連鎖刪除或連鎖更新
 當另一個table的pk異動時,也會影響本table的fk值
 當fk同時為pk,在另一邊table的pk異動時會連鎖影響本table資料
 當僅做fk,在另一邊table的pk異動時會連鎖影響本table資料
on < delete|update> no action 用在forigen key則不動作
 當另一個table的pk異動時,本table的fk不會受影響
 當fk同時為pk,在另一邊table的pk異動時會本table會發生錯誤
 僅做fk,在另一邊table的pk異動時不會影響本table
ps:
外來鍵不建議與table同時建立
建議使用alter語法在table建完後在修改該欄位為外來鍵

………………………………………………………………………………………………………….

修改資料表
ALTER TABLE < tablename> < action>

常用action有以下
修改欄位屬性為foreign key
alter table < tablename> add [constraint < name>] foreign key(< column>) references < table(column)> [option]
修改欄位data type
alter table < tablename> alter column < name> < datatype>
移除foreign key屬性
alter table < tablename> drop constraint < name>

ps:
constraint name會記錄在sysobjects
sysobjects資料表的xtype欄位,若為F表示外來鍵
ex:select * from sysobjects where xtype=’F’

…………………………………………………………………………………………………………

刪除資料表
DROP TABLE < tablename>

ps:
通常刪除的順序會和建立的順序相反
若被其他table參考時,會無法刪除
若兩table互相參考對方,需先移除foreign key屬性


…………………………………………………………………………………………………………


建立VIEW
CREATE VIEW < viewname> AS < select sql>

建立trigger
CREATE TRIGGER < name> ON [order details] FOR < insert,update,delete> AS < sql>