Postgresql
列約束優於表約束的優點
除了寫這篇文章的風格之外,還有什麼優點嗎?
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,我對除生成的列之外的所有列使用第二種形式。