在 PostgreSQL 中的现有表上创建主键?
虽然很少见,但您可能会遇到需要在现有表上定义主键的情况。这可以使用ALTERTABLE语句来实现。
语法是-
ALTER TABLE table_name ADD PRIMARY KEY (column_name1, column_name2,…., columns_nameN)
从上面的语法可以看出,可以在多列上定义PRIMARYKEY。当您在多个列上定义了PRIMARYKEY时,条件是列对应该具有唯一且非空的值。因此,如果在(column1,column2)上定义了PRIMARYKEY,则允许值(value1,value2)、(value3,value2)和(value1,value4)。即使column1重复了value1并且column2重复了value2,但当一起考虑时,这对列具有唯一值。
让我们考虑一个例子来理解这一点。让我们创建一个表格标记并按如下方式填充它-
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*frommarks2),您将看到类似于以下内容的输出-
到目前为止,该表还没有设置主键。现在,让我们尝试将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
这正如预期的那样。PRIMARYKEY不能有重复的值。现在,让我们尝试在(name,roll_no)对上设置PRIMARYKEY。
ALTER TABLE marks ADD PRIMARY KEY (name, roll_no)
这将起作用,因为(name,roll_no)的组合不重复。