2016-05-21 17 views
0

我已經創建了在Postgres如下表...'串行'列自動成爲PostgreSQL中的主鍵嗎?

create table printq (
    model varchar(20), 
    session integer, 
    timestamp timestamp DEFAULT now(), 
    id serial); 

似乎做的正是我需要它...它自動遞增的ID列,當我使用清除截斷表「 RESTART IDENTITY「它重置序列(這就是爲什麼我重建表的原因 - 用於在截斷時不重新啓動的id列)

無論如何,當我在表上做\ d時,沒有看到關於主鍵的任何信息。

Table "public.printq" 
    Column |   Type    |      Modifiers      
-----------+-----------------------------+----------------------------------------------------- 
model  | character varying(20)  | 
session | integer      | 
timestamp | timestamp without time zone | default now() 
id  | integer      | not null default nextval('printq_id_seq'::regclass) 

三個問題:

  • 是ID列已經因爲它的主鍵自動遞增,還是沒有?

  • 如果不是,爲什麼這張表需要一個主鍵,因爲它似乎工作正常?我知道基本上每個表都應該有一個主鍵,但爲什麼呢?

  • 最後,\ d命令告訴我該表是否有主鍵?如果不是,會告訴我什麼?

回答

2
  1. 沒有,使用id serial primary key了點。
  2. 那麼,一張表並不實際「需要」一個主鍵。它可以沒有PK生活,它可以生活在沒有自動增長的領域,它可以包含重複行。但是在關係理論(在其上構建SQL)中,每個關係(即表)都是行(在數學意義上)的集合。所以重複的行是不允許的,它們在集合中是不可能的。因此,每個關係都有一個字段(或多個字段),對所有關係都有唯一的值。此字段可用於唯一標識一行,並且可能的唯一鍵之一稱爲主鍵。 這樣的密鑰通常對於識別行非常有用,這就是爲什麼表應該有它們。但從技術上講它們不是必需的。
  3. 是的,它會的。