《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;