1. 程式人生 > 其它 >Oracle資料庫之建立表結構

Oracle資料庫之建立表結構

Oracle資料庫之建立表結構

主鍵與外來鍵

主鍵:關係型資料庫中的一條記錄中有若干個屬性,若其中的某一個屬性組(可以是一個屬性,也可以是多個)能唯一標識一條記錄,那麼該屬性組就是主鍵。

外來鍵:關係型資料庫表中的一列或者某幾列的組合,它的值與另外一張表的某一列或者某幾列相匹配,且為另一張表的主鍵(即這張表的某一列或某幾列是另外一張表的主鍵,稱這一列或幾列為另外一張表的外來鍵)。

注意:

  1. 一張表主鍵只能有一個,可以有多個外來鍵以及唯一索引
  2. Oracle資料庫共有5個約束:主鍵、外來鍵、非空、唯一、條件
    • 非空:這個列的值不能為空(NOT NULL)
    • 唯一:這個列的值在表中是唯一存在的,不能重複,但可以為空值(NULL)
    • 條件:可以對列的值設定在某個範圍內,如人的年齡就不能為負數等。
  3. 主鍵和唯一約束的區別:主鍵是列的值為表中的唯一標識,不能為空值(NULL),而唯一約束是列的值在表中唯一存在,可以為空值(NULL)。

表的建立

語法結構:

CREATE TABLE [schema.]table_name
(column datatype [constraint-clause][, column  datatype [constraint-clause]] … )
[TABLESPACE tablespace]
[PCTFREE integer]
[PCTUSED integer]
[INITRANS integer]
[MAXTRANS integer]
[STORAGE storage-clause]
[LOGGING|NOLOGGING]
[CACHE|NOCACHE] ];

說明:

  • schema:表的所有者
  • table_name:表名
  • column:欄位名
  • datatype:欄位的資料型別
  • constraint-clause:列約束說明
  • tablespace:表所在的表空間
  • PCTFREE:為了行長度增長而在每個塊中保留的空間的量(以佔整個空間減去塊頭部後所剩餘空間的百分比形式表示),當剩餘空間不足pctfree時,不再向該塊中增加新行。
  • PCTUSED:在塊剩餘空間不足pctfree後,塊已使用空間百分比必須小於pctused後,才能向該塊中增加新行。
  • INITRANS:在塊中預先分配的事務項數,預設值為1
  • MAXTRANS:限定可以分配給每個塊的最大事務項數,預設值為255
  • STORAGE:標識決定如何將區分配給表的儲存子句
  • LOGGING:指定表的建立將記錄到重做日誌檔案中。它還指定所有針對該表的後續操作都將被記錄下來。這是預設設定。
  • NOLOGGING:指定表的建立將不被記錄到重做日誌檔案中。
  • CACHE:指定即使在執行全表掃描時,為該表檢索的塊也將放置在緩衝區快取記憶體的LRU列表最近使用的一端。
  • NOCACHE:指定在執行全表掃描時,為該表檢索的塊將放置在緩衝區快取記憶體的LRU列表最近未使用的一端。
  • STORAGE子句:
  • INITIAL:初始區的大小
  • NEXT:下一個區的大小
  • PCTINCREASE:以後每個區空間增長的百分比
  • MINEXTENTS:段中初始區的數量
  • MAXEXTENTS:最大能擴充套件的區數

常用建表示例:

-- 無約束
CREATE TABLE Items(
    ItemNO number(2),
    ItemName varchar2(20)
);
-- 主鍵約束
CREATE TABLE Items(
    ItemNO number(2) constraint PK_Items primary key,
    ItemName varchar2(20) not null
);
-- 外來鍵約束
CREATE TABLE Business(
    BusiNo number(2) constraint PK_Business primary key,
    BusiName varchar2(32) not null,
    ItemNO number(2),
    StartTime date,
    constraint FK_Business foreign key(ItemNO) references Items(ItemNO)
);
-- “唯一”和“條件”約束
CREATE TABLE Computers(
    CompNo number(4) constraint PK_Comp primary key,
    CompModel varchar2(64) unique,
    BuyTime date,
    Price number(7,2) constraint ch_price check(price>0 and price<=30000),
    Owner varchar2(32));

注意:

constraint:定義表中約束所必須的關鍵字

primary key:主鍵約束關鍵字

foreign key…references…:建立表的外來鍵關鍵字

unique:為唯一約束關鍵字

constraint…check…:為條件約束的關鍵字

一個完整的示例:

CREATE TABLE Employee(
    id  NUMBER(5) CONSTRAINT pk_employee_id PRIMARY KEY,
    last_name VARCHAR2(10) CONSTRAINT employee_last_name_nn NOT NULL,
    first_name VARCHAR2(10) NOT NULL UNIQUE,
    userid VARCHAR2(8) CONSTRAINT un_employee_userid UNIQUE,
    start_date DATE DEFAULT SYSDATE,
    title VARCHAR2(10),
    dept_id NUMBER(7) CONSTRAINT fk_employee_dept_id REFERENCES dept(id),
    salary NUMBER(11,2),
    user_type VARCHAR2(4) CONSTRAINT ck_employee_user_type CHECK (user_type IN('IN','OUT')),
    CONSTRAINT employee_uq_title UNIQUE (title,salary)
)
TABLESPACE tsb_01
INITRANS 1
MAXTRANS 255
PCTFREE 20
PCTUSED 50
STORAGE (INITIAL 1024K NEXT 1024K PCTINCREASE 0 MINEXTENTS 1 MAXEXTENTS 5)

刪除表

DROP TABLE employee;

修改表

-- 修改表的名稱
RENAME Items TO OrderItems;
-- 顯示錶結構
DESC OrderItems;
-- 增加列
ALTER TABLE test ADD address varchar2(40);
-- 刪除列
ALTER TABLE test DROP COLUMN address;
-- 修改列的名稱
ALTER TABLE test MODIFY address addresses varchar(40);
-- 修改列的屬性
ALTER TABLE Emp modify score not null;

新增約束,語法如下:

ALTER TABLE 表名稱 ADD CONSTRAINT 約束名稱 約束型別(約束欄位) 
-- 示例
ALTER TABLE Dept ADD CONSTRAINT pk_dept primary key(id);
ALTER TABLE Dept ADD CONSTRAINT fk_dept_comp foreign key(companyid) references Company;

刪除約束,語法:

ALTER TABLE 表名稱 DROP CONSTRAINT 約束名稱;    
-- 示例
ALTER TABLE book DROP CONSTRAINT fk_book_pid;