Oracle
在“CREATE TABLE”語句中定義約束
最近我一直在使用由名為web2py的 Python 網路框架建構的數據庫抽象層(點擊查看他們的 DAL 語法)。它們包括在語句中包含約束的選項。
CREATE TABLE
在採用斯坦福大學的“數據庫簡介”MOOC時,提到SQL 標準
CREATE TABLE
支持語句中的任何查詢作為約束(實質上取代了觸發器的主要案例)。什麼是最佳實踐?
CREATE TABLE
下面是一個在語句中包含約束的簡單範例;而不是通過ALERT TABLE
和/或CREATE TRIGGER
語句:CREATE TABLE Place ( address VARCHAR2(40), CONSTRAINT place_pk PRIMARY KEY (address) ); CREATE TABLE Company ( c_name VARCHAR2(40), CONSTRAINT company_pk PRIMARY KEY (c_name) ); CREATE TABLE Employee ( e_name VARCHAR2(40), tax_no NUMBER, salary NUMBER(19,4), sex CHAR, birthdate DATE, address VARCHAR2(40), CONSTRAINT employee_pk PRIMARY KEY (tax_no), CONSTRAINT address_fk FOREIGN KEY (address) REFERENCES Place(address), CHECK (address IS NOT NULL) ); CREATE TABLE CompanyEmployee ( employee_id NUMBER, company_id VARCHAR2(40), CONSTRAINT unique_employee_id UNIQUE(employee_id), CONSTRAINT employee_id_fk FOREIGN KEY (employee_id) REFERENCES Employee(tax_no), CONSTRAINT company_id_fk FOREIGN KEY (company_id) REFERENCES Company(c_name), CONSTRAINT company_employees_pk PRIMARY KEY (employee_id, company_id) );
順便說一句:您會注意到我使用 CAPS 作為關鍵字,大寫 CamelCase 用於表名,而小寫 under_score 用於屬性和触發器名稱。這是好習慣嗎?- 也可以隨意批評我的縮進和空格使用風格:)
在企業級數據庫中,您可以很好地拆分約束,以便更輕鬆地重新載入大量數據。我見過
- 裸創建表語句
- 候選鍵(包括主鍵),
- 外鍵,
- 檢查約束,
- 等等。
每一個都將在一個或多個文件中。所有這些文件都將受到版本控制。
理由是載入大量數據然後應用約束比在聲明約束和索引*後載入大量數據更快。*通過在 makefile 中進行一些文本操作,您仍然可以生成包含所有約束的“完整”CREATE TABLE 語句。