Postgresql

列約束優於表約束的優點

  • June 24, 2018

除了寫這篇文章的風格之外,還有什麼優點嗎?

CREATE TABLE foo (
 a int PRIMARY KEY,
 b int
);

進而,

CREATE TABLE bar (
 a int REFERENCES foo,
 c int
);

超過,

BEGIN;
 CREATE TABLE bar (
   a int,
   c int
 );
 ALTER TABLE bar
   ADD FOREIGN KEY (a)
   REFERENCES foo;
COMMIT;

我正在嘗試建構一個 DDL 生成器,所以我想知道是否需要保持列上的約束(我之前生成它們的位置),或者將它們全部移到表之外?我知道這些結果會產生同一張表,我只是想知道引擎蓋下是否有任何優勢——更少的 wal?ETC?

兩個 DDL 生成相同的數據庫結構沒有區別。

FOREIGN KEY關係使用複合鍵時,需要第二種形式(或以下形式)。

CREATE TABLE bar (
   a int,
   c int,
   FOREIGN KEY (a,c) REFERENCES foo(a,c)
);

依我看來:

CREATE TABLE bar (
 a int REFERENCES foo,
 c int
);

比以下更容易理解:

BEGIN;
 CREATE TABLE bar (
   a int,
   c int
 );
 ALTER TABLE bar
   ADD FOREIGN KEY (a)
   REFERENCES foo;
COMMIT;

另一方面,解析後者更容易,以防您想遍歷表定義並首先創建表,然後是約束(無需按拓撲順序對錶進行排序)。

FWIW,我對除生成的列之外的所有列使用第二種形式。

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