在已有的PostgreSQL表中建立主鍵?
雖然很少見,但你可能會遇到需要在現有表上定義主鍵的情況。這可以使用ALTER TABLE語句實現。
語法如下:
ALTER TABLE table_name ADD PRIMARY KEY (column_name1, column_name2,…., columns_nameN)
從上面的語法可以看出,你可以在多個列上定義主鍵。當你在多個列上定義主鍵時,條件是列對應該具有唯一且非空的值。因此,如果主鍵定義在(column1, column2)上,則允許值(value1, value2)、(value3, value2)和(value1, value4)。即使column1的值value1重複,column2的值value2重複,但當將列對一起考慮時,它們的值是唯一的。
讓我們考慮一個例子來理解這一點。讓我們建立一個名為marks的表並填充它,如下所示:
CREATE TABLE marks( name VARCHAR, roll_no INTEGER, marks_obtained INTEGER, perc_marks DOUBLE PRECISION, max_marks INTEGER, date_of_entry DATE ); INSERT INTO marks(name, roll_no, marks_obtained, perc_marks, max_marks, date_of_entry) VALUES ('Yash', 26, 42, 42.0, 100, current_date), ('Isha', 56, 175, 87.5, 200, current_date), ('Yash', 35, 12, 24, 50, current_date);
如果你查詢該表(SELECT * from marks2),你會看到類似於以下的輸出:
姓名 | 學號 | 獲得分數 | 百分比分數 | 滿分 | 錄入日期 |
---|---|---|---|---|---|
Yash | 26 | 42 | 42 | 100 | 2021-01-31 |
Isha | 56 | 175 | 87.5 | 200 | 2021-01-31 |
Yash | 35 | 12 | 24 | 50 | 2021-01-31 |
這個表目前還沒有設定主鍵。現在,讓我們嘗試將name列定義為主鍵。
ALTER TABLE marks ADD PRIMARY KEY (name)
PostgreSQL將返回一個錯誤:
ERROR: could not create unique index "marks_pkey" DETAIL: Key (name)=(Yash) is duplicated. SQL state: 23505
這是預期的。主鍵不能有重複的值。現在,讓我們嘗試在(name, roll_no)對上設定主鍵。
ALTER TABLE marks ADD PRIMARY KEY (name, roll_no)
這將有效,因為沒有(name, roll_no)組合是重複的。
廣告