1. 程式人生 > >《SQL入門經典》筆記(第三章:建立資料庫之管理資料庫物件)

《SQL入門經典》筆記(第三章:建立資料庫之管理資料庫物件)

1. 什麼是資料庫物件?

資料庫物件用於儲存或引用資料,需要被定義,例如表、試圖、簇、序列、索引和異名(讓表具有另一個名稱)。

 

2. 什麼是規劃?

規劃是與資料庫某個使用者名稱相關聯的資料庫物件集合。相應的使用者名稱被稱為“規劃所有人”/“關聯物件組的所有人”。

同一個資料庫中可以在不同規劃下有相同表名的不同表。如果沒有指定規劃,資料庫預設選擇所有同名的表。

一個數據庫可以有多個規劃人。例如“user1”登入到資料庫建立了EMPLOYEE_TBL時,從資料庫角度,這個表應該叫做“USER1.EMPLOYEE_TBL”。

在自己的規劃裡不必引用規劃名稱,兩種表達均可:

EMPLOYEE_TBL
USER1.EMPLOYEE_TBL

 

 

3. 表:

是關係型資料庫裡最主要、最簡單的資料儲存形式。

列=欄位,命名時學會合理使用下劃線。

 

(1) 在create table table_name前,應學會花時間思考表的設計。就像寫程式一樣。

一個示例:

CREATE TABLE table_name
(field1 data_type [not null],
 field2 data_type [null]
);

CREATE TABLE EMPLOYEE_TBL
(EMP_ID CHAR(9) NOT NULL,
 EMP_PHONE INTEGER NULL
);

 

(2)ALTER TABLE可以新增刪除列、修改列定義、新增和去除約束,在某些實現中還可以修改表SOTRAGE值。

 

修改表元素(列的屬性,包含:資料型別、長度、有效位數、標度、列值能否為空):

ALTER TABLE EMPLOYEE_TBL MODIFY
EMP_ID VARCHAR(10);

 

新增列的一條基本規則是:如果表中已經有資料,不能新增為NOT NULL的列。原因:如果現有記錄沒有包含新列所需要的所有資料,就會自相矛盾。我們可以選擇強行新增一個為NULL的列,然後挨個插入記錄,再把列的屬性改為NOT NULL。可以看到,很麻煩了。

 

新增自動增加的列:很多時候需要這個功能,比如沒有合適的主鍵,自己增加一個ID需要作為主鍵。MYSQL提供了SERIAL方法為表生成真正的唯一值:

CREATE TABLE TEST_INCREAMENT(
ID SERIAL,
TEST_NAME VARCHAR(20));

 

修改列的一些通用規則:

  • 列長可增加到特定資料型別所允許的最大長度;
  • 縮短列長需要所有資料的長度都小於等於新長度;
  • 數值資料的位數可增加;想要縮短,要求同上;
  • 數值的小數位數可以增加或減少;
  • 列的資料型別一般是可以改變的

 

(3) 從現有表新建另一個表:

利用CREATE TABLE和SELECT語句可以複製現有的表。

CREATE TABLE NEW_TABLE_NAME AS
SELECT [*|column1, column2]
FROM TABLE_NAME
[WHERE]

 

(4)刪除表:

使用restrict並且表被檢視或約束所引用,DROP語句會報錯。

CASCADE選項能成功刪除,全部引用檢視和約束全部刪除。

drop table table_name [restrict\cascade]

刪表儘量帶上規劃名,否則容易誤刪。

 

4. 完整性約束:

完整性約束用於確定關係型資料庫的準確性和一致性。在關係型資料庫中,資料完整性通過引用完整性實現。

 

5. 引用完整性:

(1)主鍵約束:

主鍵是表裡一個或多個用於實現記錄唯一性的欄位(主鍵可以由多個欄位構成),體現每條記錄的唯一性。

我們可以使用如下主鍵定義方法。此時,主鍵是一個隱含約束,在建立表時產生。

CREATE TABLE EMPLOYEE_TBL(
EMP_ID CHAR(9) NOT NULL PRIMARY KEY,
EMP_NAME VARCHAR(20) NOT NULL);

此外還可以使用:

CREATE TABLE EMPLOYEE_TBL(
EMP_ID CHAR(9) NOT NULL,
EMP_NAME VARCHAR(20),
PRIMARY KEY(EMP_ID));

 

(2)唯一性約束:

唯一性約束要求表裡某個欄位的值在每條記錄裡都是唯一的,與主鍵類似。可以當做主鍵的備胎。從下面的例子可知,唯一性約束可為空值,但是存在的值必須保證其唯一性。

CREATE TABLE EMPLOYEE_TBL (
EMP_ID CHAR(9) NOT NULL PRIMARY KEY,
EMP_NAME VARCHAR(20) NOT NULL,
EMP_PHONE INTEGER(10) NULL UNIQUE);

 

(3)外來鍵約束:

外來鍵是子表裡的一個欄位,引用父表裡的主鍵。外來鍵約束是確保表與表之間引用完整性的主要機制。在下面的例子中,EMP_ID被定義為表EMPLOYEE_PAY_TBL的外來鍵。

父子關係:子表EMPLOYEE_PAY_TBL裡的欄位EMP_ID的每一個值在父表EMPLOYEE_TBL的主鍵EMP_ID中都有對應的值。當父表刪除該主鍵中的一個值,子表中對應的值也會被刪除,這就是引用完整性。

CREATE TABLE EMPLOYEE_PAY_TST(
EMP_ID CHAR(9) NOT NULL,
PAY_RATE NUMBER(4,2) NOT NULL,
CONSTRAINT EMP_ID_FK FOREIGN KEY (EMP_ID) REFERENCES EMPLOYEE_TBL(EMP_ID));

除了上述方法,還可以用ALTER TABLE向表裡新增外來鍵:

ALTER TABLE EMPLOYEE_PAY_TBL
ADD CONSTRAINT ID_FK FOREIGN KEY (EMP_ID)
REFERENCES EMPLOYEE_TBL (EMP_ID)

 

(4) NOT NULL約束:

NOT NULL也可以被看做一個約束。

 

(5)檢查約束:

檢查(CHK)約束用於檢查輸入到特定欄位的資料的有效性。檢查約束可以為資料提供了另一層保護,檢查資料是否處於一定範圍。

 

(6)去除約束:

利用ALTER TABLE命令的DROP CONSTRAINT 選項可以去除已經定義的約束。例如下面去除主鍵約束。

ALTER TABLE EMPLOYEES DROP PRIMARY KEY;