Oracle

在“CREATE TABLE”語句中定義約束

  • April 6, 2013

最近我一直在使用由名為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 語句。

引用自:https://dba.stackexchange.com/questions/36917